Индексация и срез строк в Python 3
Строки – это тип данных Python, который представляет собой последовательность из одного или нескольких символов (букв, цифр, пробелов и других символов). Поскольку строки являются последовательностями, с ними можно взаимодействовать так же, как и с другими типами данных на основе последовательности – путём индексации и среза.
Данное руководство научит вас индексировать строки, создавать срезы и использовать некоторые методы подсчёта и поиска символов.
Индексация строк
Каждому символу в строке соответствует индексный номер, начиная с 0. К примеру, строка 8host Blog! индексируется следующим образом:
| 8 | h | o | s | t | B | l | o | g | ! | |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Как видите, индексом первого символа является 0, последний индекс, 10, принадлежит символу «!».Любой другой символ или знак препинания (*#$&.;?,) также будет иметь свой собственный номер индекса.
Следует обратить внимание на то, что пробел также является частью строки, потому тоже имеет свой индекс (в данном случае 5).
Принимая во внимание тот факт, что каждый символ в строке Python имеет соответствующий индекс, вы можете управлять строками так же, как и любыми другими последовательными типами данных.
Поиск символа по положительному индексу
Ссылаясь на индекс, вы можете извлечь один символ из строки. Для этого индекс помещается в квадратные скобки. Объявите строку и попробуйте извлечь один из её символов.
ss = «8host Blog!»
print(ss[4])
t
Когда вы ссылаетесь на конкретный индекс, Python возвращает символ, которому этот индекс принадлежит. Символ t в строке 8host Blog! имеет индекс 4.
Выбор символа по отрицательному индексу
К примеру, у вас есть очень длинная строка. Чтобы точно определить её конец, можно начать счёт в обратном порядке, начиная с конца строки и индекса -1.
К примеру, строка 8host Blog!будет иметь следующий негативный индекс:
| 8 | h | o | s | t | B | l | o | g | ! | |
| -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
Запросите символ с отрицательным индексом -9:
Отрицательный индекс позволяет выбрать символ в длинной строке.
Срез строк
Также вы можете вызвать диапазон символов из строки. К примеру, вывести только Blog. Для этого используется оператор нарезки, а получившийся в результате фрагмент данных называется срезом. Чтобы создать срез, введите диапазон индексов в квадратные скобки, разделив их двоеточием:
Как можно понять из примера, 6 – индекс первого символа среза (включительно), а 10 – индекс символа после среза (по сути, в срез входят символы с индексами 6, 7, 8 и 9; восклицательный знак с индексом 10 уже не входит в срез).
Выполняя нарезку строки, вы создаёте новую строку, точнее, подстроку – строку, которая существует внутри другой строки (к примеру, строка Blog существует внутри строки 8host Blog!).
Чтобы включить в срез начало или конец строки, можно опустить индекс первого или последнего её символа. К примеру, чтобы вывести только 8host (первое слово строки), можно ввести:
Как видите, индекс первого символа не указан.
Чтобы вывести подстроку, начиная с середины строки и до конца, можно ввести:
Также в срезе можно использовать отрицательный индекс. Как говорилось в предыдущем разделе, отрицательная индексация начинается с -1 с конца строки, обратный отсчёт продолжается до первого символа строки.
Попробуйте запросить срез с помощью отрицательного индекса:
Срезы с шагом
В предыдущем разделе срез был взят по такому шаблону:
включая индекс start и не включая индекс stop. Однако срезы можно задавать по трём параметрам:
где stride – шаг. Этот параметр указывает, на сколько символов нужно продвинуться после взятия первого символа. По умолчанию шаг в Python равен 1, то есть, Python будет извлекать символы по порядку.
Шаг со стандартным значением 1 можно не указывать – это не повлияет на поведение Python. Например:
print(ss[6:10])
Blog
print(ss[6:10:1])
Blog
Стандартный шаг будет выводить каждый индекс. Попробуйте задать нестандартное значение шага:
Если шаг – 2, Python пропустить каждый второй символ и выведет символы исходной строки через один (выведенные символы выделены красным):
8 h o s t B l o g !
Обратите внимание: пробел с индексом 5 также был пропущен, поскольку он является отдельным символом в последовательности.
Попробуйте увеличить шаг:
Такой шаг выведет каждый четвертый символ после первого символа строки.
Запрашивая всю строку, вы можете не указывать первые два параметра (start и stop), так как при этом Python по умолчанию выводит строку от начала до конца.
Также вы можете использовать отрицательные индексы. Шаг -1 выведет символы строки в обратном порядке:
print(ss[::-1])
!golB tsoh8
Первые два параметра пропущены, потому Python выведет все символы строки.
Попробуйте запросить всю строку с шагом -2:
При этом символы строки будут выведены в обратном порядке через один:
! g o l B t s o h 8
Методы подсчета
Методы подсчета позволяют ограничить количество символов в формах пользовательского ввода и сравнивать строки. Как и для других последовательных типов данных, для работы со строками существует несколько методов.
Метод len() выводит длину любого последовательного типа данных (включая строки, списки, кортежи и словари).
Запросите длину строки ss:
Строка «8host Blog!» содержит 11 символов.
Кроме переменных, метод len() может подсчитать длину любой заданной строки, например:
print(len(«Let’s print the length of this string.»))
38
Метод len() подсчитывает общее количество символов в строке.
Метод str.count()может подсчитать, сколько раз в строке повторяется тот или иной символ. Запросите количество символов о в строке «8host Blog!».
Запросите другой символ:
Несмотря на то, что символ b присутствует в запрашиваемой строке, метод возвращает 0, поскольку он чувствителен к регистру. Чтобы вывести символы по нижнему регистру, используйте метод str.lower().
Используйте метод str.count() на последовательность символов:
likes = «Mary likes to swim in the ocean, and likes to smile.»
print(likes.count(«likes»))
2
Подстрока likes встречается в вышеприведённой строке дважды.
Чтобы определить индекс символа в строке, используйте метод str.find().
Для примера запросите индекс символа o в строке ss:
Первый символ о в строке «8host Blog!» находится под индексом 2.
Попробуйте узнать индекс первого символа подстроки «likes» внутри строки likes:
Но в данной строке последовательность likes встречается дважды. Как узнать индекс первого символа второй последовательности likes? Методу str.find() можно задать второй параметр – индекс, с которого нужно начинать поиск.
print(likes.find(«likes», 9))
37
Заключение
Теперь вы обладаете базовыми навыками работы со строками, умеете индексировать их и создавать срезы.
Индексация и разделение строк в Python 3

Тип строки данных Python представляет собой последовательность, составленную из одного или нескольких отдельных символов, в том числе букв, чисел, пробелов или специальных символов. Поскольку строка представляет собой последовательность, к ней можно получить доступ посредством индексации и разделения, как и к другим типам данных на базе последовательностей.
В этом учебном модуле вы узнаете, как получать доступ к строкам через индексацию, как разделять их через последовательности символов и как использовать методы подсчета и определения расположения символов.
Индексация строк
Как и тип данных списка, который содержит элементы, соответствующие индексу, строки также содержат символы, которым соответствуют индексы, начиная с 0.
Для строки Sammy Shark! индекс выглядит следующим образом:
| S | a | m | m | y | S | h | a | r | k | ! | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Как видите, первая S начинается с индекса 0, а заканчивается строка символом ! с индексом 11.
Также отметим, что символу пробела между Sammy и Shark также соответствует собственный индекс. В данном случае пробелу соответствует индекс 5.
Восклицательному знаку ( ! ) также соответствует индекс. Все другие специальные символы и знаки препинания, в том числе *#$&. ;? , также являются символами и будут иметь свои индексы.
Поскольку каждый символ в строке Python имеет свой индекс, мы можем получать доступ к строкам и совершать с ними манипуляции так же, как и с другими типами последовательных данных.
Доступ к символам через положительный числовой индекс
Используя ссылки на числовые индексы, мы можем изолировать один из символов в строке. Для этого мы поместим индекс в квадратные скобки. Давайте декларируем строку, выведем ее и вызовем индекс в квадратных скобках:
Когда мы ссылаемся на определенный числовой индекс строки, Python возвращает символ, находящийся на соответствующей позиции. Поскольку букве y соответствует индекс 4 строки ss = "Sammy Shark!" , когда мы выводим ss[4] , мы получаем y в качестве вывода.
Числовые индексы позволяют получать доступ к определенным символам в строках.
Доступ к символам через отрицательный индекс
Если у нас имеется длинная строка, и мы хотим использовать символ ближе к концу строки, мы также можем использовать обратный отсчет от конца строки, начиная с индекса -1 .
Для той же строки Sammy Shark! отрицательная разбивка индекса выглядит следующим образом:
| S | a | m | m | y | S | h | a | r | k | ! | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
Используя отрицательные индексы, мы можем вывести символ r , используя ссылку на его положение в индексе -3, как показано в следующей последовательности:
Использование отрицательных индексов может быть полезно для изоляции отдельных символов ближе к концу длинной строки.
Разделение строк
Также мы можем вызвать ряд символов из строки. Допустим, мы хотим вывести слово Shark . Для этого мы можем создать срез, представляющий собой последовательность символов в исходной строке. С помощью срезов мы можем вызывать несколько значений символов, создавая диапазоны символов, разделенные двоеточием [x:y] :
При построении среза, такого как [6:11] , первый индекс соответствует началу среза (включительно), а второй — окончанию среза (не включительно). Поэтому в нашем примере конец диапазона обозначается индексом позиции сразу после конца строки.
При разделении строк на срезы мы создаем подстроки, то есть, строки внутри других строк. Вызывая ss[6:11] , мы вызываем подстроку Shark , существующую в строке Sammy Shark! .
Если мы хотим включить любой конец строки, мы можем пропустить одно из чисел в синтаксисе string[n:n] . Например, если нам нужно вывести первое слово строки ss — “Sammy”, мы можем сделать это так:
Мы пропустили индекс перед двоеточием в синтаксисе среза и указали только индекс после двоеточия, обозначающий конец подстроки.
Чтобы вывести подстроку, начинающуюся в середине строки и идущую до конца строки, мы можем указать только индекс перед двоеточием:
Если мы укажем только индекс перед двоеточием и не укажем второй индекс, подстрока будет идти от соответствующего первому индексу символа до конца строки.
Для создания срезов также можно использовать отрицательные индексы. Как мы уже говорили раньше, отрицательные индексы строки начинаются с -1 и отсчитываются далее к началу строки. При использовании отрицательных индексов, мы начинаем с меньшего числа, потому что соответствующий ему символ идет раньше.
Давайте используем два отрицательных индекса для создания среза строки ss :
Подстрока “ark” выводится из строки “Sammy Shark!”, потому что символ “a” соответствует индексу -4, а символ “k” находится перед позицией индекса -1.
Определение шага при создании срезов строк
В дополнение к двум индексам при создании срезов можно использовать третий параметр. Третий параметр указывает шаг, означающий, на сколько символов нужно сдвинуться после извлечения первого символа из строки. В предыдущих примерах мы не использовали параметр шага, а по умолчанию Python использует значение шага 1, выводя все символы между двумя индексами.
Давайте снова посмотрим на пример выше, который выводит подстроку “Shark”:
Мы можем получить те же результаты, добавив третий параметр шага со значением 1:
Если шаг равен 1, выводятся все символы между двумя индексами среза. Если мы опустим параметр шага, Python будет по умолчанию использовать значение 1.
Если же мы увеличим значение шага, некоторые символы будут пропущены:
Если мы зададим шаг 2 как последний параметр в синтаксисе Python ss[0:12:2] , будет пропущен каждый второй символ. Выводимые символы обозначены красным цветом:
S a m m y S h a r k !
Обратите внимание, что символ пробела с индексом 5 также пропускается, если задан шаг 2.
Если мы используем более крупное значение шага, подстрока будет значительно короче:
Если мы укажем шаг 4 как последний параметр синтаксиса Python ss[0:12:4] , будет выведен только каждый четвертый символ. Выводимые символы также обозначены красным цветом:
S amm y Sh a rk!
В этом примере символ пробела тоже пропускается.
Поскольку мы выводим всю строку, мы можем опустить два индекса и оставить два двоеточия в синтаксисе, чтобы получить тот же результат:
Если мы пропустим два индекса и оставим запятые, мы включим в диапазон всю строку, а последний параметр будет определять шаг, то есть, количество пропускаемых символов.
Также мы можем указать отрицательное значение шага и использовать его для вывода исходной строки в обратном порядке, если зададим шаг -1:
Два двоеточия без параметров означают вывод всех символов первоначальной строки, шаг 1 означает вывод всех символов без пропуска, а отрицательное значение шага изменяет порядок вывода символов на противоположный.
Давайте повторим эту команду, но используем шаг -2:
В этом примере, ss[::-2] , мы включаем в диапазон всю первоначальную строку, поскольку индексы не указаны, и задаем обратный порядок вывода отрицательным значением шага. Кроме того, с шагом -2 мы пропускаем каждую вторую букву строки, выводимой в обратном порядке:
! k r a h S [пробел] y m m a S
В этом примере выводится символ пробела.
Задавая третий параметр синтаксиса среза Python, мы указываем шаг подстроки, которую извлекаем из первоначальной строки.
Методы подсчета
Когда мы говорим об индексах символов в строках, стоит упомянуть о некоторых методах подсчета строк или вывода индексов. Это может быть полезно для того, чтобы ограничить количество символов, которые мы хотим включить в форму ввода, или чтобы сравнивать строки. Для подсчета строк, как и других символов последовательных данных, можно использовать несколько методов.
Вначале мы рассмотрим метод len() , который поможет определить длину любого типа данных упорядоченной или неупорядоченной последовательности, включая строки, списки, кортежи и словари.
Давайте выведем длину строки ss :
Длина строки “Sammy Shark!” составляет 12 символов, включая символ пробела и символ восклицательного знака.
Вместо использования переменной мы также можем передать строку прямо в метод len() :
Метод len() подсчитывает общее количество символов в строке.
Если нам нужно подсчитать, сколько раз в строке встречается определенный символ или последовательность символов, мы можем использовать метод str.count() . Давайте возьмем нашу строку ss = "Sammy Shark!" и подсчитаем, сколько раз в ней встречается символ “a”:
Мы можем поискать и другой символ:
Хотя в строке есть буква “S”, важно понимать, что при подсчете учитывается регистр. Если мы хотим найти все буквы в строке независимо от регистра, мы можем использовать метод str.lower() , чтобы предварительно конвертировать все символы строки в нижний регистр. Вы можете узнать больше об этом методе в учебном модуле Введение в методы строк в Python 3.
Давайте попробуем использовать str.count() с последовательностью символов:
В строке likes последовательность символов, эквивалентная “likes”, встречается в исходной строке 3 раза.
Также мы можем определить позицию символа или последовательности символов в строке. Для этого мы можем использовать метод str.find() , который выводит позицию символа на базе номера индекса.
Мы можем посмотреть, где появляется первый символ “m” в строке ss :
Первый символ “m” появляется в строке “Sammy Shark!” на позиции с индексом 2. Мы можем проверить позиции индекса в строке ss выше.
Давайте посмотрим, где встречается первая последовательность символов “likes” в строке likes :
Первый экземпляр последовательности символов “likes” начинается с индекса 6, соответствующего позиции символа l в последовательности likes .
Что делать, если, если мы хотим увидеть, где начинается вторая последовательность “likes”? Для этого мы можем передать второй параметр в метод str.find() , который будет начинаться с конкретного индекса. Вместо того, чтобы начинать с начала строки, начнем с индекса 9:
Во втором примере, который начинается с индекса 9, первая последовательность символов “likes” начинается с индекса 34.
Также мы можем указать в качестве третьего параметра конец диапазона. Как и в случае со срезами, мы можем использовать обратный отсчет, указав отрицательный индекс:
В последнем примере мы ищем позицию последовательности “likes” между индексами 40 и -6. Поскольку последний параметр отрицательный, отсчет выполняется с конца первоначальной строки.
Методы строки len() , str.count() и str.find() можно использовать для определения длины, количества символов или последовательностей символов и индексов символов или последовательностей символов в строках.
Заключение
Возможность вызова определенных индексов строк или конкретного среза строки дает дополнительную гибкость при работе с этим типом данных. Поскольку строки относятся к последовательному типу данных, как списки и кортежи, для доступа к ним можно использовать индексы и срезы.
Чтобы продолжить изучение строк, вы можете прочитать дополнительные материалы по форматированию строк и методам строк.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Как узнать индекс буквы в строке python
Напомню, что мы работаем с Python в Jupyter Notebook. Это, по сути, записная книжка для программирования, и в ней мы можем прописывать не только код, но и текст, который помогает, например, вести конспект лекции и не забыть, какое действие выполняет та или иная ячейка. Делать пометки также полезно, чтобы те, с кем вы поделитесь кодом, смогли его прочитать. Тетрадку этого урока можно скачать на нашем GitHub.
Давайте попробуем это сделать и напишем тему урока. Сегодня мы поговорим о таком типе данных в Python как строки. Чтобы сделать заголовок «Строки», прописываем текст в первой ячейке, затем в верхнем меню выбираем тип Heading и активируем ячейку (shift и enter). Теперь она выглядит как заголовок. Чтобы добавить подзаголовок «Как выглядят строки», делаем все то же самое, но выбираем тип Markdown.
Кроме этого, мы можем делать текстовые пометки в ячейке с кодом. Для этого перед текстом нужно поставить знак #. Когда мы запустим эту ячейку, программа выполнит код и проигнорирует текст после #.
Что такое строки
Строка в Python – это последовательный набор символов, который может состоять как из цифр, так и из букв, и разделителей. Для создания строки мы используем кавычки (одинарные или двойные – не имеет значения). Я напишу пример строки и присвою его переменной а. Например: a=’важные истории’ или b=’0123456789’. Давайте проверим, что а и b действительно строки. Определяем их тип: type(a) и type(b). И видим str (string) – это и означает, что перед нами именно строки.
Сложение строк
Первая операция со строками, которую мы изучим – конкатенация (или сложение строк). Давайте создадим две новые строки a=’важные’, b=’истории’. Строки в Python относятся к категории неизменяемых последовательностей, то есть все функции и методы могут лишь создавать новую строку. Поэтому, чтобы соединить a и b в одну новую строку – мы должны создать переменную c, и положить в нее a+b. И тогда мы получим новую строку, в которой будут соединены две предыдущие. Так как они соединились без разделителя, чтобы между словами был пробел, нам надо прописать его внутри первой строки: a=’важные ’, b=’истории’. Если мы сложим эти две строки, внутри которых находятся числа, эта операция не сложит эти цифры, а соединит их в одно выражение: a=’1 ’, b=’2’, с=a+b, c=’12’.
Дублирование строк
Строки также можно дублировать. Для этого применяется операция умножения (*). Например, если мы умножим a*3, получим слово ’важные ’ с пробелом, записанное 3 раза.
Длина строк
Мы можем измерить длину строки, она равна количеству символов в строке. Давайте снова положим в переменную а слова ’важные истории’: a=’важные истории’ И измерим длину строки. Делается это так: len(a). Мы увидим, что длина строки равна количеству букв в словах ’важные истории’ плюс еще один символ – пробел.
Индексы
Каждый символ в строке имеет свой индекс – то есть порядковый номер. Но в Python эти номера начинаются не с 1, а с 0. То есть первый символ будет нулевым, второй первым, третий вторым и так далее. Давайте посмотрим на примере. Чтобы узнать индекс конкретного символа, есть специальная операция index(). Например, a.index(‘в’), где a – это название переменной, а в скобках искомое значение. Эта операция выдаст нам 0. Это значит, что буква «в» имеет нулевой индекс. Если мы таким же образом найдем индекс буквы «а», мы получим 1. Буква «и» встречается в строке 3 раза. Если мы попытаемся узнать индекс повторяющегося символа, мы получим индекс первой по порядку буквы «и», в данном случае – 7. Мы также можем узнать, какой символ записан под тем или иным индексом. Например, чтобы узнать, какой символ имеет нулевой индекс, мы должны написать следующую строчку кода: a[0]. Мы получим букву «в». Соответственно, a[1] покажет букву «а», и так далее. Индексы можно рассчитывать и с обратной стороны строки. Например, если мы напишем a[-3], то получим букву «р», которая стоит на третьем с конца месте строки.
Извлечение среза
Мы можем извлекать из строк не только отдельные символы, но и целые отрезки. Например, из выражения «важные истории», можно извлечь только слово «важные». Для этого нам надо написать конструкцию вида a[x:y], где x – индекс первого символа, а y – индекс последнего символа + 1. Так как индекс, записанный в «y» не включается, то например, когда мы указываем 6, мы подразумеваем, что последний индекс будет равен 5. К примеру, если мы укажем a[0:6], то получим первые 6 символов – слово «важные», несмотря на то, что индекс буквы «е» равен 5.
Если мы не укажем никаких символов – a[:], то код выдаст нам строку целиком, потому что по умолчанию x=0, а y=длине строки. Поэтому мы можем указывать только индекс начала отрезка или только индекс конца. a[7:] или a[:6].
Шаг среза
Мы так же можем указать шаг среза через еще одно двоеточие. Давайте сначала положим в переменную а цифры от 0 до 9: a=’0123456789′. И затем попросим отрезать все символы от первого до последнего с шагом 2: a[0:10:2]. Это означает, что мы выведем первый символ, второй пропустим, третий возьмем, четвертый пропустим и так далее.
Замена шаблона
Мы можем заменить часть строки на новую. Например, давайте превратим «важные истории» в «грустные истории». Делается это так: a=’важные истории’, b=a.replace(‘важные’,’грустные’), где на первом месте в скобках указывается старое значение, а на втором новое.
Изменение регистра текста
Можно изменить регистр текста внутри строки. Например, сейчас «важные истории» написаны в нижнем регистре, но с помощью операции upper() мы можем перевести буквы в верхний регистр и потом обратно в нижний с помощью операции lower().
Разделение строк
Строки можно разделять. За это отвечает операция split(). Например, b=a.split(). Тогда наше выражение поделится на два слова. В данном случае программа сама нашла разделитель – это пробел. Но не все символы он не считывает как разделители. Если бы слово «важные» было поделено на буквы с точками – «в.а.ж.н.ы.е.», операция разделения выдала бы следующий результат: [‘в.а.ж.н.ы.е’]. Чтобы получить список из букв слова «важные», мы можем указать разделитель – точку – самостоятельно: b=a.split(‘.’).
Если мы узнаем тип данных получившегося объекта, мы увидим, что это list – то есть список. О том, что такое списки в Python, мы расскажем в следующий выпусках мастерской. А пока рекомендую вам выполнить все операции из этого урока самостоятельно. А если что-то не получится, вы можете написать в наш чат в Telegram, и мы вам поможем. Кроме этого, практически на любой вопрос можно найти ответ на сайте Stack Overflow – это сервис вопросов и ответов о программировании, в котором пользователи помогают друг другу. Почти на все вопросы, которые возникали в процессе обучения Python у меня, там уже были ответы.
Строки и символьные данные в Python
В статье по основным типам данных в Python вы узнали, как определить строки: объекты, содержащие последовательности символьных данных. Обработка символьных данных является неотъемлемой частью программирования.
Вот что вы узнаете из этого урока: Python предоставляет богатый набор операторов, функций и методов для работы со строками. Когда вы закончите с этим уроком, вы будете знать, как получить доступ и извлечь части строк, а также будете знакомы с методами, которые доступны для манипулирования и изменения строковых данных.
Вы также познакомитесь с двумя другими объектами Python, используемыми для представления необработанных байтовых данных, типами bytes и bytearray .
Обработка строк
В следующих разделах описаны операторы, методы и функции, доступные для работы со строками.
Операторы строк
Вы уже видели операторы + и * , применяемые к числовым операндам в уроке по операторам и выражениям в Python. Эти два оператора могут быть применены и к строкам.
Оператор +
Оператор + объединяет строки. Он возвращает строку, состоящую из операндов, соединенных вместе, как показано здесь:
Оператор *
Оператор * создает несколько копий строки. Если s -строка, а n -целое число, то любое из следующих выражений возвращает строку, состоящую из n сцепленных копий s :
Вот примеры обеих форм:
Операнд множителя n должен быть целым числом. Вы могли бы подумать, что это должно быть положительное целое число, но забавно, что оно может быть нулевым или отрицательным, и в этом случае результатом будет пустая строка:
Если бы вы создали строковую переменную и инициализировали ее пустой строкой, присвоив ей значение ‘foo’ * -8 , любой справедливо подумал бы, что вы немного глупы. Но это сработает.
Оператор in
Python также предоставляет оператор членства, который можно использовать со строками. Оператор in возвращает True , если первый операнд содержится во втором, и False в противном случае:
Существует также оператор not in , который делает обратное:
Встроенные строковые функции
Как вы видели в уроке по основным типам данных в Python, Python предоставляет множество функций, встроенных в интерпретатор и всегда доступных. Вот некоторые из них, которые работают со строками:
| Функция | Описание |
|---|---|
| chr() | Преобразует целое число в символ |
| ord() | Преобразует символ в целое число |
| len() | Возвращает длину строки |
| str() | Возвращает строковое представление объекта |
Они более подробно рассматриваются ниже.
Возвращает целочисленное значение для данного символа.
На самом базовом уровне компьютеры хранят всю информацию в виде чисел. Для представления символьных данных используется схема перевода, которая сопоставляет каждый символ с его репрезентативным номером.
Самая простая схема в обычном использовании называется ASCII એ . Он охватывает общие латинские символы, с которыми вы, вероятно, больше всего привыкли работать. Для этих символов ord(c) возвращает значение ASCII એ для символа c :
Символы ASCII એ встречаются довольно часто. Но в мире существует множество различных языков и бесчисленное множество символов и глифов, которые появляются в цифровых медиа. Полный набор символов, которые потенциально могут потребоваться для представления в компьютерном коде, намного превосходит обычные латинские буквы, цифры и символы, которые вы обычно видите.
Unicode એ — это амбициозный стандарт, который пытается предоставить числовой код для каждого возможного символа, на каждом возможном языке, на каждой возможной платформе. Python 3 широко поддерживает Юникод, включая разрешение символов Юникода в строках.
Пока вы остаетесь в области общих символов, существует небольшая практическая разница между ASCII и Unicode. Но функция ord() также возвращает числовые значения для символов Юникода:
Возвращает символьное значение для данного целого числа.
chr() делает обратное ord() . При заданном числовом значении n chr(n) возвращает строку, представляющую символ, соответствующий n :
chr() также обрабатывает символы Юникода:
С помощью функции len() вы можете проверить длину строки Python. len(s) возвращает количество символов в s :
str(obj)
Возвращает строковое представление объекта.
Практически любой объект в Python может быть представлен в виде строки. str(obj) возвращает строковое представление объекта obj :
Индексация Строк
Часто в языках программирования отдельные элементы в упорядоченном наборе данных могут быть доступны непосредственно с помощью числового индекса или ключевого значения. Этот процесс называется индексированием.
В Python строки-это упорядоченные последовательности символьных данных, и поэтому их можно индексировать таким образом. Доступ к отдельным символам в строке можно получить, указав имя строки, за которым следует число в квадратных скобках ( [] ).
Индексация строк в Python основана на нуле: первый символ в строке имеет индекс 0 , следующий-индекс 1 и так далее. Индекс последнего символа будет равен длине строки минус единица.
Например, схематическое представление индексов строки ‘ foobar ‘ будет выглядеть следующим образом:

Отдельные символы могут быть доступны по индексу следующим образом:
Попытка индексировать за пределами конца строки приводит к ошибке:
Строковые индексы также могут быть заданы отрицательными числами, и в этом случае индексация происходит от конца строки назад: -1 относится к последнему символу, -2 -к предпоследнему символу и т. д. Вот та же самая диаграмма, показывающая как положительные, так и отрицательные индексы в строке ‘ foobar ‘:

Вот несколько примеров негативной индексации:
Попытка индексирования с отрицательными числами за пределами начала строки приводит к ошибке:
Для любой непустой строки s , s[len(s)-1] и s[-1] оба возвращают последний символ. Нет никакого индекса, который имеет смысл для пустой строки.
Нарезка строк
Python также допускает форму синтаксиса индексирования, которая извлекает подстроки из строки, известную как нарезка строк. Если s является строкой, то выражение вида [m:n] возвращает часть s , начинающуюся с позиции m и вплоть до позиции n , но не включая ее:
Помните: строковые индексы основаны на нуле. Первый символ в строке имеет индекс 0. Это относится как к стандартному индексированию, так и к нарезке.
Опять же, второй индекс указывает первый символ, который не включен в результат—символ ‘ r ‘ ( s[5] ) в приведенном выше примере. Это может показаться немного неинтуитивным, но это приводит к такому результату, который имеет смысл: выражение s[m:n] вернет подстроку длиной n — m символов, в данном случае 5 — 2 = 3 .
Если вы опустите первый индекс, срез начнется в начале строки. Таким образом, s[:m] и s[0:m] эквивалентны:
Аналогично, если вы опустите второй индекс, как в s[n:] , срез простирается от первого индекса до конца строки. Это хорошая, лаконичная альтернатива более громоздкому s[n:len(s)] :
Для любых строк и любого целого числа n (0 = n = len(s)) , s[:n] + s[n:] будет равно s :
Опущение обоих индексов возвращает исходную строку целиком. Буквально. Это не копия, а ссылка на исходную строку:
Если первый индекс в срезе больше или равен второму индексу, Python возвращает пустую строку. Это еще один запутанный способ сгенерировать пустую строку, если вы ее искали:
Отрицательные индексы также могут быть использованы при нарезке. -1 относится к последнему символу, -2 -к предпоследнему и так далее, как и в случае простого индексирования. На приведенной ниже диаграмме показано, как срезать подстроку » oob «из строки » foobar «, используя как положительные, так и отрицательные индексы:

Вот соответствующий код Python:
Указание шага в срезе строки
Существует еще один вариант синтаксиса нарезки, который следует обсудить. Добавление дополнительного : и третий индекс обозначает шаг, который указывает, сколько символов нужно перепрыгнуть после извлечения каждого символа в срезе.
Например, для строки ‘ foobar ‘ фрагмент 0:6:2 начинается с первого символа и заканчивается последним символом (целой строкой), а каждый второй символ пропускается. Это показано на следующей диаграмме:

Аналогично, 1:6:2 задает срез, начинающийся со второго символа (индекс 1) и заканчивающийся последним символом, и снова значение шага 2 вызывает пропуск всех остальных символов:

Иллюстративный REPL код показан здесь:
Как и при любом разрезании, первый и второй индексы могут быть опущены, а по умолчанию используются соответственно первый и последний символы:
Вы также можете указать отрицательное значение шага, и в этом случае Python делает шаг назад через строку. В этом случае начальный/первый индекс должен быть больше конечного/второго индекса:
В приведенном выше примере 5:0:-2 означает “начать с последнего символа и отступить назад на 2, вплоть до первого символа, но не включая его.”
Когда вы отступаете назад, если первый и второй индексы опущены, значения по умолчанию меняются интуитивно: первый индекс по умолчанию находится в конце строки, а второй индекс по умолчанию-в начале. Вот вам пример:
Это обычная парадигма для обращения строки вспять:
Интерполяция переменных в строку
В Python версии 3.6 был введен новый механизм форматирования строк. Эта функция формально называется форматированным строковым литералом, но чаще всего упоминается под псевдонимом f-string.
Одна простая функция вне строк, которую вы можете начать использовать сразу же,-это переменная интерполяция. Вы можете указать имя переменной непосредственно в литерале f-string, и Python заменит это имя соответствующим значением.
Например, предположим, что вы хотите отобразить результат арифметического вычисления. Это можно сделать с помощью простого оператора print() , разделяющего числовые значения и строковые литералы запятыми:
Но это слишком громоздко. Чтобы сделать то же самое, используйте f-строку:
- Укажите либо нижний регистр f либо верхний регистр F непосредственно перед открывающей кавычкой строкового литерала. Это говорит Python, что это f-строка вместо стандартной строки.
- Укажите любые переменные, которые будут интерполированы в фигурных скобках ( <> ).
Переделанный с помощью f-строки, приведенный выше пример выглядит гораздо чище:
Любой из трех механизмов цитирования Python может быть использован для определения f-строки:
Изменение Строк
Короче говоря, вы не можете. Строки-это один из типов данных, которые Python считает неизменяемыми, то есть не подлежащими изменению. Фактически, все типы данных, которые вы видели до сих пор, неизменны. (Python предоставляет типы данных, которые являются изменяемыми, как вы скоро увидите.)
Подобное утверждение приведет к ошибке:
По правде говоря, нет особой необходимости изменять строки. Обычно вы можете легко выполнить то, что хотите, создав копию исходной строки, которая имеет желаемое изменение на месте. В Python есть очень много способов сделать это. Вот одна из возможностей:
Для этого также существует встроенный строковый метод:
Читайте дальше для получения дополнительной информации о встроенных строковых методах!
Встроенные строковые методы
В уроке по переменным в Python вы узнали, что Python-это высоко объектно-ориентированный язык. Каждый элемент данных в программе Python является объектом.
Вы также знакомы с функциями: вызываемыми процедурами, которые можно вызвать для выполнения определенных задач.
Методы подобны функциям. Метод — это специализированный тип вызываемой процедуры, тесно связанный с объектом. Как и функция, метод вызывается для выполнения отдельной задачи, но он вызывается для конкретного объекта и имеет знание о своем целевом объекте во время выполнения.
Синтаксис вызова метода для объекта выглядит следующим образом:
Это вызывает метод .foo() на объекте obj.<args> указывает аргументы, передаваемые методу (если таковые имеются).
Вы узнаете гораздо больше об определении и вызове методов позже в обсуждении объектно-ориентированного программирования. На данный момент цель состоит в том, чтобы представить некоторые из наиболее часто используемых встроенных методов, поддерживаемых Python для работы со строковыми объектами.
В следующих определениях методов аргументы, указанные в квадратных скобках ( [] ), являются необязательными.
Преобразования Регистра
Методы этой группы выполняют преобразование регистра в целевой строке.
s.capitalize()
Возвращает целевую строку с заглавной первой буквой.
s.capitalize() возвращает копию s с первым символом, преобразованным в верхний регистр, и всеми остальными символами, преобразованными в нижний регистр:
Неалфавитные символы остаются неизменными:
s.lower()
Преобразует буквенные символы в строчные.
s.lower() возвращает копию s со всеми заглавными символами, преобразованными в нижний регистр:
s.swapcase()
Меняет местами регистр буквенных символов.
s.swapcase() возвращает копию s с заглавными буквенными символами, преобразованными в строчные и наоборот:
s.title()
Преобразует целевую строку в » регистр заголовка.”
s.title() возвращает копию s , в которой первая буква каждого слова преобразуется в верхний регистр, а остальные буквы-в нижний:
Этот метод использует довольно простой алгоритм. Он не пытается провести различие между важными и неважными словами, и он не обрабатывает апострофы, притяжательные или аббревиатуры изящно:
s.upper()
Преобразует буквенные символы в заглавные.
s.upper() возвращает копию s со всеми буквенными символами, преобразованными в верхний регистр:
Найти и заменить
Эти методы предоставляют различные средства поиска целевой строки для указанной подстроки.
Каждый метод в этой группе поддерживает необязательные аргументы <start> и <end> . Они используются для нарезки строк: действие метода ограничено частью целевой строки, начинающейся с позиции символа <start> и продолжающейся до позиции символа <end> , но не включающей ее. Если < start> указан, а <end> нет, то метод применяется к части целевой строки от <start> до конца строки.
s.count(<sub>[, <start>[, <end>]])
Подсчитывает вхождения подстроки в целевую строку.
s.count(<sub>) возвращает количество неперекрывающихся вхождений подстроки <sub> в s :
Подсчет ограничен количеством вхождений в подстроку, обозначенную <start> и <end> , если они указаны:
s.endswith(<suffix>[, <start>[, <end>]])
Определяет, заканчивается ли целевая строка заданной подстрокой.
s.endswith(<suffix>) возвращает True , если s заканчивается указанным <suffix> , и False в противном случае:
Сравнение ограничивается подстрокой, обозначенной <start> и <end> , если они указаны:
s.find(<sub>[, <start>[, <end>]])
Выполняет поиск в целевой строке заданной подстроки.
Вы можете использовать .find() , чтобы увидеть, содержит ли строка определенную подстроку. s.find(<sub>) возвращает самый низкий индекс в s , где находится подстрока <sub> :
Этот метод возвращает -1 , если указанная подстрока не найдена:
Поиск ограничен подстрокой, указанной <start> и <end> , если они указаны:
s.index(<sub>[, <start>[, <end>]])
Выполняет поиск в целевой строке заданной подстроки.
Этот метод идентичен методу .find() , за исключением того, что он вызывает ошибку, если <sub> не найден, а не возвращает -1 :
s.rfind(<sub>[, <start>[, <end>]])
Поиск в целевой строке заданной подстроки, начинающейся в конце.
s.rfind(<sub>) возвращает самый высокий индекс в s , где найдена подстрока <sub> :
Как и в случае с .find() , если подстрока не найдена, возвращается -1 :
Поиск ограничен подстрокой, указанной <start> и <end> , если они указаны:
s.rindex(<sub>[, <start>[, <end>]])
Поиск в целевой строке заданной подстроки, начинающейся в конце.
Этот метод идентичен методу .rfind() , за исключением того, что он вызывает ошибку, если <sub> не найден, а не возвращает -1 :
s.startswith(<prefix>[, <start>[, <end>]])
Определяет, начинается ли целевая строка с заданной подстроки.
При использовании метода .startswith() s.startswith(<suffix>) возвращает True , если s начинается с указанного <suffix> , и False в противном случае:
Сравнение ограничивается подстрокой, обозначенной <start> и <end> , если они указаны:
Классификация Символов
Методы этой группы классифицируют строку на основе содержащихся в ней символов.
s.isalnum()
Определяет, состоит ли целевая строка из буквенно-цифровых символов.
s.isalnum() возвращает True , если s непусто и все его символы являются буквенно-цифровыми(либо буквой, либо цифрой), и False в противном случае:
s.isalpha()
Определяет, состоит ли целевая строка из буквенных символов.
s.isalpha() возвращает True , если s непусто и все его символы алфавитны, и False в противном случае:
s.isdigit()
Определяет, состоит ли целевая строка из цифровых символов.
Вы можете использовать метод .isdigit() , чтобы проверить, состоит ли ваша строка только из цифр. s.isdigit() возвращает True , если s непусто и все его символы являются числовыми цифрами, и False в противном случае:
s.isidentifier()
Определяет, является ли целевая строка допустимым идентификатором Python.
s.isidentifier() возвращает True , если s является допустимым идентификатором Python в соответствии с определением языка, и False в противном случае:
Примечание: .isidentifier() вернет True для строки, которая соответствует ключевому слову Python, даже если это на самом деле не является допустимым идентификатором:
Вы можете проверить, соответствует ли строка ключевому слову Python, используя функцию iskeyword() , которая содержится в модуле keyword . Один из возможных способов сделать это показан ниже:
Если вы действительно хотите убедиться, что строка будет служить допустимым идентификатором Python, вы должны проверить, что .isidentifier() является истинным, а iskeyword() — ложным.
s.islower()
Определяет, являются ли буквенные символы целевой строки строчными.
s.islower() возвращает True , если s непусто и все содержащиеся в нем буквенные символы строчные, и False в противном случае. Неалфавитные символы игнорируются:
s.isprintable()
Определяет, состоит ли целевая строка полностью из печатаемых символов.
s.isprintable() возвращает True , если s пуст или все содержащиеся в нем буквенные символы доступны для печати. Он возвращает False , если s содержит хотя бы один непечатаемый символ. Неалфавитные символы игнорируются:
Примечание: Только метод .isxxxx() возвращает True , если s является пустой строкой. Все остальные возвращают False для пустой строки.
s.isspace()
Определяет, состоит ли целевая строка из пробельных символов.
s.isspace() возвращает True , если s непусто и все символы являются пробелами, и False в противном случае.
Наиболее часто встречающимися пробелами являются пробел ‘ ‘, табуляция ‘ \t ‘ и новая строка ‘ \n ‘:
Однако есть несколько других символов ASCII, которые квалифицируются как пробелы, и если вы учитываете символы Unicode, то их довольно много:
s.istitle()
Определяет, является ли целевая строка заголовком.
s.istitle() возвращает True , если s непусто, первый буквенный символ каждого слова прописной, а все остальные буквенные символы в каждом слове строчные. В противном случае он возвращает False :
Примечание: вот как документация Python описывает .istitle() , если вы находите это более интуитивно понятным: “заглавные символы могут следовать только за несокращенными символами, а строчные-только за прописными.”
s.isupper()
Определяет, являются ли буквенные символы целевой строки заглавными.
s.isupper() возвращает True , если s непусто и все содержащиеся в нем буквенные символы заглавные, и False в противном случае. Неалфавитные символы игнорируются:
Форматирование Строк
Методы этой группы изменяют или улучшают формат строки.
s.center(<width>[, <fill>])
s.center(<width>) возвращает строку, состоящую из s , центрированных в поле width <width> ;. По умолчанию заполнение состоит из символа пробела ASCII:
Если указан необязательный аргумент <fill> , то он используется в качестве символа заполнения:
Если аргумент уже имеет длину не менее <width> , то он возвращается без изменений:
s.expandtabs(tabsize=8)
Разворачивает столбцы в строку.
s.expandtabs() заменяет каждый символ табуляции (‘ \t ‘) пробелами. По умолчанию пробелы заполняются при условии остановки табуляции в каждом восьмом столбце:
tabsize является необязательным параметром, определяющим остановку колонны:
s.ljust(<width>[, <fill>])
Левостороннее выравнивание строки в поле.
s.ljust(<width>) возвращает строку, состоящую из s , выровненных по левому краю в поле ширина <width> . По умолчанию заполнение состоит из символа пробела ASCII:
Если указан необязательный аргумент <fill> , то он используется в качестве символа заполнения:
Если s уже достигает ширины такой как <width> , то он возвращается без изменений:
s.lstrip([<chars>])
Обрезает ведущие символы из строки.
s.lstrip() возвращает копию s с любыми пробелами, удаленными с левого конца:
Если указан необязательный аргумент <chars> , то это строка, указывающая набор удаляемых символов:
s.replace(<old>, <new>[, <count>])
Заменяет вхождения подстроки в строке.
В Python для удаления символа из строки можно использовать метод string.replace() . Метод s.replace(<old>, <new>) возвращает копию s со всеми вхождениями подстроки <old> , замененной на <new> .:
Если указан необязательный аргумент <count> , то выполняется максимум замен <count> , начиная с левого конца s :
s.rjust(<width>[, <fill>])
Правостороннее выравнивание строки в поле.
s.rjust(<width>) возвращает строку, состоящую из s , выровненных по правому краю в поле ширины <width> . По умолчанию заполнение состоит из символа пробела ASCII:
Если указан необязательный аргумент <fill> , то он используется в качестве символа заполнения:
Если s уже по крайней мере равен <width> , то он возвращается без изменений:
s.rstrip([<chars>])
Обрезает конечные символы из строки.
s.rstrip() возвращает копию s с любыми пробелами, удаленными с правого конца:
Если указан необязательный аргумент <chars> , то это строка, указывающая набор удаляемых символов:
s.strip([<chars>])
Удаляет символы с левого и правого концов строки.
s.strip() по существу эквивалентен вызову s.lstrip() и s.rstrip() последовательно. Без аргумента <chars> он удаляет начальные и конечные пробелы:
Как и в случае с .lstrip() и .rstrip() , необязательный аргумент <chars> указывает набор удаляемых символов:
Примечание: когда возвращаемое значение строкового метода является другой строкой, как это часто бывает, методы могут быть вызваны последовательно путем цепочки вызовов:
s.zfill(<width>)
Подкладывает строку слева нулями.
s.zfill(<width>) возвращает копию s , заполненную слева символами ‘ 0 ‘ до указанной <width> :
Если s содержит начальный знак, он остается на левом краю результирующей строки после вставки нулей:
Если s уже по крайней мере равен <width> , то он возвращается без изменений:
.zfill() наиболее полезен для строковых представлений чисел, но Python все равно будет обнулять строку, которая не является таковой.:
Преобразование между строками и списками
Методы в этой группе преобразуют между строкой и некоторым составным типом данных либо вставляя объекты вместе, чтобы сделать строку, либо разбивая строку на части.
Многие из этих методов возвращают либо список, либо кортеж. Это составные типы данных, которые являются прототипическими примерами итерируемые объекты в Python. Они описаны в следующем уроке, так что вы скоро узнаете о них! До тех пор просто думайте о них как о последовательностях значений. Список заключен в квадратные скобки ( [] ), а кортеж-в круглые скобки ( () ).
С этим введением давайте взглянем на эту последнюю группу строковых методов.
s.join(<iterable>)
Конкатенация строк из итерируемого объекта.
s.join(<iterable>) возвращает строку, полученную в результате объединения объектов в <iterable> , разделенных s .
Обратите внимание, что .join() вызывается на s , строке-разделителе. <iterable> также должна быть последовательностью строковых объектов.
Некоторые примеры кода должны помочь прояснить ситуацию. В следующем примере разделителями являются строки ‘ , ‘, а <iterable> — список строковых значений:
В результате получается одна строка, состоящая из объектов списка, разделенных запятыми.
В следующем примере <iterable> задается как одно строковое значение. Когда строковое значение используется в качестве итеративного, оно интерпретируется как список отдельных символов строки:
Таким образом, в результате ‘ : ‘ .join(‘corge’) получается строка, состоящая из каждого символа в ‘ corge ‘, разделенного ‘ : ‘.
Этот пример терпит неудачу, потому что один из объектов в <iterable> не является строкой:
Это можно исправить с помощью:
Скоро увидите, многие составные объекты в Python могут быть истолкованы как итеративные, и .join() особенно полезен для создания строк из них.
s.partition(<sep>)
Делит строку на основе разделителя.
s.partition(<sep>) разбивает s при первом вхождении строки <sep> . Возвращаемое значение представляет собой кортеж из трех частей, состоящий из:
- Часть s , предшествующая <sep>
- Сам <sep>
- Часть s , следующая за <sep>
Вот несколько примеров .partition() в действии:
Если <sep> не найден в s , возвращаемый кортеж содержит s , за которым следуют две пустые строки:
s.rpartition(<sep>)
Делит строку на основе разделителя.
s.rpartition(<sep>) функционирует точно так же, как s.partition(<sep>) , за исключением того, что s разделяется при последнем вхождении <sep> вместо первого вхождения:
s.rsplit(sep=None, maxsplit=-1)
Разбивает строку на список подстрок.
Без аргументов s.split() разбивает s на подстроки, разделенные любой последовательностью пробелов, и возвращает подстроки в виде списка:
Если указан <sep> , то он используется в качестве разделителя для разделения:
(Если <sep> задано со значением None , строка разделяется пробелом, как если бы <sep> вообще не было задано.)
Когда <sep> явно задан в качестве разделителя, предполагается, что последовательные разделители в s разделяют пустые строки, которые будут возвращены:
Однако это не тот случай, когда <sep> опущен. В этом случае последовательные пробелы объединяются в один разделитель, и результирующий список никогда не будет содержать пустых строк:
Если указан необязательный параметр ключевого слова <maxsplit> , то выполняется максимум такое количество разбиений, начиная с правого конца s :
Значение по умолчанию для <maxsplit> равно -1 , что означает, что должны быть выполнены все возможные разбиения— так же, как если бы <maxsplit> был полностью опущен:
s.split(sep=None, maxsplit=-1)
Разбивает строку на список подстрок.
s.split() ведет себя точно так же, как s.rsplit() , за исключением того, что если задано <maxsplit> , то разбиения отсчитываются с левого конца s , а не с правого:
Если <maxsplit> не указан, то .split() и .rsplit() неразличимы.
s.splitlines([<keepends>])
Разрывает строку на границах линий.
s.splitlines() разбивает s на строки и возвращает их в виде спика. Любой из следующих символов или последовательностей символов считается границей линии:
| Escape-символ | Описание |
|---|---|
| \n | Новая строка |
| \r | Возврат к началу строки |
| \r\n | Возврат к началу строки + заполнение |
| \v или \x0b | Подведение Линии |
| \f или \x0c | Перевод на следующий лист(Form Feed) |
| \x1c | Разделение файлов |
| \x1d | разделитель групп |
| \x1e | разделитель записей |
| \x85 | Следующая Строка (Контрольный Код C1) |
| \u2028 | Разделитель Строк Unicode |
| \u2029 | Разделитель Абзацев Unicode |
Вот пример использования нескольких различных разделителей строк:
Если в строке присутствуют последовательные символы границ строк, предполагается, что они разделяют пустые строки, которые появятся в списке результатов:
Если необязательный аргумент <keepends> указан и является истинным, то границы строк сохраняются в результирующих строках:
Объекты bytes
Объект bytes является одним из основных встроенных типов для манипулирования двоичными данными. Объект bytes — это неизменяемая последовательность однобайтовых значений. Каждый элемент в объекте bytes представляет собой небольшое целое число в диапазоне от 0 до 255.
Определение литерала объекта bytes
Байтовый литерал определяется так же, как и строковый литерал с добавлением префикса ‘ b ‘ :
Как и в случае со строками, вы можете использовать любой из механизмов одинарного, двойного или тройного цитирования:
В байтовом литерале допускаются только символы ASCII. Любое символьное значение больше 127 должно быть указано с помощью соответствующей escape-последовательности:
Префикс ‘ r ‘ может использоваться в байтовом литерале для отключения обработки escape-последовательностей, как и в случае со строками:
Определение объекта bytes с помощью встроенной функции bytes()
Функция bytes() также создает объект bytes . Какой тип байтов возвращается объекту, зависит от аргумента(ов), переданного функции. Возможные формы приведены ниже.
bytes(<s>, <encoding>)
Создает объект bytes из строки.
bytes(<s>, <encoding>) преобразует строку <s> в объект bytes , используя str.encode() в соответствии с заданной <encoding> :
Техническое Примечание: В этой форме функции bytes() требуется аргумент <encoding> . «Кодирование» относится к способу перевода символов в целочисленные значения. Значение «utf 8″ указывает на формат преобразования Unicode UTF-8, который является кодировкой, способной обрабатывать все возможные символы Unicode. UTF-8 также можно указать, указав » UTF8 «, » utf-8 » или » UTF-8 » для <encoding> .
Дополнительные сведения см. В документации Unicode. До тех пор, пока вы имеете дело с обычными латинскими символами, UTF-8 будет хорошо служить вам.
bytes(<size>)
Создает объект bytes , состоящий из нулевых ( 0x00 ) байтов.
bytes(<size>) определяет объект bytes указанного <size> , который должен быть положительным целым числом. Результирующий объект bytes инициализируется нулевыми ( 0x00 ) байтами:
bytes(<iterable>)
Создает объект bytes из итерируемого объекта.
bytes(<iterable>) определяет объект bytes из последовательности целых чисел, сгенерированных <iterable> . <iterable> должен быть итегрируемым, который генерирует последовательность целых чисел n в диапазоне 0 ≤ n ≤ 255 :
Операции с байтовыми объектами
Как и строки, объекты bytes поддерживают общие операции последовательности:
- Операторы in и not in :
- Операторы конкатенации ( + ) и репликации ( * ) :
- Индексирование и нарезка:
- Встроенные функции:
Многие методы, определенные для строковых объектов, допустимы и для байтовых объектов:
Обратите внимание, однако, что когда эти операторы и методы вызываются для объекта bytes , операнд и аргументы также должны быть объектами bytes :
Хотя определение и представление байтового объекта основано на тексте ASCII, на самом деле он ведет себя как неизменяемая последовательность небольших целых чисел в диапазоне от 0 до 255 включительно. Вот почему один элемент из объекта bytes отображается как целое число:
Однако срез отображается как байтовый объект, даже если он имеет длину всего в один байт:
Вы можете преобразовать объект bytes в список целых чисел с помощью встроенной функции list()
Шестнадцатеричные числа часто используются для указания двоичных данных, поскольку две шестнадцатеричные цифры непосредственно соответствуют одному байту. Класс bytes поддерживает два дополнительных метода, облегчающих преобразование в строку шестнадцатеричных цифр и обратно.
bytes.fromhex(<s>)
Возвращает объект bytes , построенный из строки шестнадцатеричных значений.
bytes.fromhex(<s>) возвращает объект bytes , полученный в результате преобразования каждой пары шестнадцатеричных цифр в <s> в соответствующее значение байта. Шестнадцатеричные пары цифр в <s> могут быть дополнительно разделены пробелами, которые игнорируются:
Примечание: этот метод является методом класса, а не методом объекта. Он привязан к классу bytes , а не к объекту bytes . В следующих уроках по объектно-ориентированному программированию вы гораздо глубже изучите различие между классами, объектами и соответствующими им методами. А пока просто обратите внимание, что этот метод вызывается в классе bytes , а не в объекте b .
Возвращает строку, содержащую шестнадцатеричное значение из объекта в байтах.
b.hex() возвращает результат преобразования байтов объекта b в строку шестнадцатеричных пар цифр. То есть он делает обратное .fromhex() :
Примечание: В отличие от .fromhex() , .hex() — это объектный метод, а не метод класса. Таким образом, он вызывается на объекте класса bytes , а не на самом классе.
Объекты bytearray
Python поддерживает другой тип двоичной последовательности, называемый bytearray . Объекты bytearray очень похожи на объекты bytes , несмотря на некоторые различия:
- В Python нет специального синтаксиса для определения литерала байтового массива, такого как префикс ‘ b ‘, который может использоваться для определения объекта bytes . Объект bytearray всегда создается с помощью встроенной функции bytearray() :
- Объекты bytearray изменчивы. Вы можете изменить содержимое объекта bytearray с помощью индексации и нарезки:
Объект bytearray также может быть построен непосредственно из объекта bytes :
Вывод
В этой учебной статье подробно рассматривается множество различных механизмов, предоставляемых Python для обработки строк, включая строковые операторы, встроенные функции, индексацию, нарезку и встроенные методы. Вы также познакомились с типами bytes и bytearray .
Эти типы являются первыми типами, которые вы рассмотрели, которые являются составными-построенными из набора меньших частей. Python предоставляет несколько составных встроенных типов. В следующем уроке вы познакомитесь с двумя наиболее часто используемыми: списками и кортежами.