Строки в python 3: Методы строк | Python
Содержание
Строки. Курс «Python. Введение в программирование»
Мы уже рассматривали строки как простой тип данных наряду с целыми и вещественными числами и знаем, что строка – это последовательность символов, заключенных в одинарные или двойные кавычки.
В Python нет символьного типа, т. е. типа данных, объектами которого являются одиночные символы. Однако язык позволяет рассматривать строки как объекты, состоящие из подстрок длинной в один и более символов. При этом, в отличие от списков, строки не принято относить к структурам данных. Видимо потому, что структуры данных состоят из более простых типов данных, а для строк в Python нет более простого (символьного) типа.
С другой стороны, строка, как и список, – это упорядоченная последовательность элементов. Следовательно, из нее можно извлекать отдельные символы и срезы.
>>> s = "Hello, World!" >>> s[0] 'H' >>> s[7:] 'World!' >>> s[::2] 'Hlo ol!'
В последнем случае извлечение идет с шагом, равным двум, т. е. извлекается каждый второй символ. Примечание. Извлекать срезы с шагом также можно из списков.
Важным отличием от списков является неизменяемость строк в Python. Нельзя перезаписать какой-то отдельный символ или срез в строке:
>>> s[-1] = '.' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment
Интерпретатор сообщает, что объект типа str
не поддерживает присвоение элементам.
Если требуется изменить строку, то следует создать новую из срезов старой:
>>> s = s[0:-1] + '.' >>> s 'Hello, World.'
В примере берется срез из исходной строки, соединяется с другой строкой. Получается новая строка, которая присваивается переменной s. Ее старое значение при этом теряется.
Методы строк
В Python для строк есть множество методов. Посмотреть их можно по команде dir(str)
, получить информацию по каждому – help(str.имя_метода)
. Рассмотрим наиболее интересные из них.
Методы split() и join()
Метод split()
позволяет разбить строку по пробелам. В результате получается список слов. Если пользователь вводит в одной строке ряд слов или чисел, каждое из которых должно в программе обрабатываться отдельно, то без split()
не обойтись.
>>> s = input() red blue orange white >>> s 'red blue orange white' >>> sl = s.split() >>> sl ['red', 'blue', 'orange', 'white'] >>> s 'red blue orange white'
Список, возвращенный методом split()
, мы могли бы присвоить той же переменной s
, то есть s = s.split()
. Тогда исходная строка была бы потеряна. Если она не нужна, то лучше не вводить дополнительную переменную.
Метод split()
может принимать необязательный аргумент-строку, указывающей по какому символу или подстроке следует выполнить разделение:
>>> s.split('e') ['r', 'd blu', ' orang', ' whit', ''] >>> '40030023'.split('00') ['4', '3', '23']
Метод строк join()
выполняет обратное действие. Он формирует из списка строку. Поскольку это метод строки, то впереди ставится строка-разделитель, а в скобках — передается список:
>>> '-'.join(sl) 'red-blue-orange-white'
Если разделитель не нужен, то метод применяется к пустой строке:
>>> ''.join(sl) 'redblueorangewhite'
Методы find() и replace()
Данные методы строк работают с подстроками. Методы find()
ищет подстроку в строке и возвращает индекс первого элемента найденной подстроки. Если подстрока не найдена, то возвращает -1.
>>> s 'red blue orange white' >>> s.find('blue') 4 >>> s.find('green') -1
Поиск может производиться не во всей строке, а лишь на каком-то ее отрезке. В этом случае указывается первый и последний индексы отрезка. Если последний не указан, то ищется до конца строки:
>>> letters = 'ABCDACFDA' >>> letters.find('A', 3) 4 >>> letters.find('DA', 0, 6) 3
Здесь мы ищем с третьего индекса и до конца, а также с первого и до шестого. Обратите внимания, что метод find()
возвращает только первое вхождение. Так выражение letters.find('A', 3)
последнюю букву ‘A’ не находит, так как ‘A’ ему уже встретилась под индексом 4.
Метод replace()
заменяет одну подстроку на другую:
>>> letters.replace('DA', 'NET') 'ABCNETCFNET'
Исходная строка, конечно, не меняется:
Так что если результат надо сохранить, то его надо присвоить переменной:
>>> new_letters = letters.replace('DA', 'NET') >>> new_letters 'ABCNETCFNET'
Метод format()
Строковый метод format()
уже упоминался при рассмотрении вывода на экран с помощью функции print()
:
>>> print("This is a {0}. It's {1}." ... .format("ball", "red")) This is a ball. It's red.
Однако к print()
он никакого отношения не имеет, а применяется к строкам. Лишь потом заново сформированная строка передается в функцию вывода.
Возможности format()
широкие, рассмотрим основные.
>>> s1 = "length - {}, width - {}, height - {}" >>> s1.format(3, 6, 2.3) 'length - 3, width - 6, height — 2.3'
Если фигурные скобки исходной строки пусты, то подстановка аргументов идет согласно порядку их следования. Если в фигурных скобках строки указаны индексы аргументов, порядок подстановки может быть изменен:
>>> s2 = "height - {1}, length - {0}" >>> s2.format(3, 6) 'height - 6, length - 3'
Кроме того, аргументы могут передаваться по слову-ключу:
>>> info = "This is a {subj}. It's {prop}." >>> info.format(subj="table", prop="small") "This is a table. It's small."
Пример форматирования вещественных чисел:
>>> "{1:.2f} {0:.3f}".format(3.33333, 10/6) '1.67 3.333'
Практическая работа
Вводится строка, включающая строчные и прописные буквы. Требуется вывести ту же строку в одном регистре, который зависит от того, каких букв больше. При равном количестве преобразовать в нижний регистр. Например, вводится строка «HeLLo World», она должна быть преобразована в «hello world», потому что в исходной строке малых букв больше. В коде используйте цикл
for
, строковые методыupper()
(преобразование к верхнему регистру) иlower()
(преобразование к нижнему регистру), а также методыisupper()
иislower()
, проверяющие регистр строки или символа.Строковый метод
isdigit()
проверяет, состоит ли строка только из цифр. Напишите программу, которая запрашивает с ввода два целых числа и выводит их сумму. В случае некорректного ввода программа не должна завершаться с ошибкой, а должна продолжать запрашивать числа. Обработчик исключений try-except использовать нельзя.
Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса
Индексация и разделение строк в 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 имеет свой индекс, мы можем получать доступ к строкам и совершать с ними манипуляции так же, как и с другими типами последовательных данных.
Доступ к символам через положительный числовой индекс
Используя ссылки на числовые индексы, мы можем изолировать один из символов в строке. Для этого мы поместим индекс в квадратные скобки. Давайте декларируем строку, выведем ее и вызовем индекс в квадратных скобках:
ss = "Sammy Shark!"
print(ss[4])
Output
y
Когда мы ссылаемся на определенный числовой индекс строки, 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, как показано в следующей последовательности:
print(ss[-3])
Output
r
Использование отрицательных индексов может быть полезно для изоляции отдельных символов ближе к концу длинной строки.
Разделение строк
Также мы можем вызвать ряд символов из строки. Допустим, мы хотим вывести слово Shark
. Для этого мы можем создать срез, представляющий собой последовательность символов в исходной строке. С помощью срезов мы можем вызывать несколько значений символов, создавая диапазоны символов, разделенные двоеточием [x:y]
:
print(ss[6:11])
Output
Shark
При построении среза, такого как [6:11]
, первый индекс соответствует началу среза (включительно), а второй — окончанию среза (не включительно). Поэтому в нашем примере конец диапазона обозначается индексом позиции сразу после конца строки.
При разделении строк на срезы мы создаем подстроки, то есть, строки внутри других строк. Вызывая ss[6:11]
, мы вызываем подстроку Shark
, существующую в строке Sammy Shark!
.
Если мы хотим включить любой конец строки, мы можем пропустить одно из чисел в синтаксисе string[n:n]
. Например, если нам нужно вывести первое слово строки ss
— “Sammy”, мы можем сделать это так:
print(ss[:5])
Output
Sammy
Мы пропустили индекс перед двоеточием в синтаксисе среза и указали только индекс после двоеточия, обозначающий конец подстроки.
Чтобы вывести подстроку, начинающуюся в середине строки и идущую до конца строки, мы можем указать только индекс перед двоеточием:
print(ss[7:])
Output
hark!
Если мы укажем только индекс перед двоеточием и не укажем второй индекс, подстрока будет идти от соответствующего первому индексу символа до конца строки.
Для создания срезов также можно использовать отрицательные индексы. Как мы уже говорили раньше, отрицательные индексы строки начинаются с -1 и отсчитываются далее к началу строки. При использовании отрицательных индексов, мы начинаем с меньшего числа, потому что соответствующий ему символ идет раньше.
Давайте используем два отрицательных индекса для создания среза строки ss
:
print(ss[-4:-1])
Output
ark
Подстрока “ark” выводится из строки “Sammy Shark!”, потому что символ “a” соответствует индексу -4, а символ “k” находится перед позицией индекса -1.
Определение шага при создании срезов строк
В дополнение к двум индексам при создании срезов можно использовать третий параметр. Третий параметр указывает шаг, означающий, на сколько символов нужно сдвинуться после извлечения первого символа из строки. В предыдущих примерах мы не использовали параметр шага, а по умолчанию Python использует значение шага 1, выводя все символы между двумя индексами.
Давайте снова посмотрим на пример выше, который выводит подстроку “Shark”:
print(ss[6:11])
Output
Shark
Мы можем получить те же результаты, добавив третий параметр шага со значением 1:
print(ss[6:11:1])
Output
Shark
Если шаг равен 1, выводятся все символы между двумя индексами среза. Если мы опустим параметр шага, Python будет по умолчанию использовать значение 1.
Если же мы увеличим значение шага, некоторые символы будут пропущены:
print(ss[0:12:2])
Output
SmySak
Если мы зададим шаг 2 как последний параметр в синтаксисе Python ss[0:12:2]
, будет пропущен каждый второй символ. Выводимые символы обозначены красным цветом:
Sammy Shark!
Обратите внимание, что символ пробела с индексом 5 также пропускается, если задан шаг 2.
Если мы используем более крупное значение шага, подстрока будет значительно короче:
print(ss[0:12:4])
Output
Sya
Если мы укажем шаг 4 как последний параметр синтаксиса Python ss[0:12:4]
, будет выведен только каждый четвертый символ. Выводимые символы также обозначены красным цветом:
Sammy Shark!
В этом примере символ пробела тоже пропускается.
Поскольку мы выводим всю строку, мы можем опустить два индекса и оставить два двоеточия в синтаксисе, чтобы получить тот же результат:
print(ss[::4])
Output
Sya
Если мы пропустим два индекса и оставим запятые, мы включим в диапазон всю строку, а последний параметр будет определять шаг, то есть, количество пропускаемых символов.
Также мы можем указать отрицательное значение шага и использовать его для вывода исходной строки в обратном порядке, если зададим шаг -1:
print(ss[::-1])
Output
!krahS ymmaS
Два двоеточия без параметров означают вывод всех символов первоначальной строки, шаг 1 означает вывод всех символов без пропуска, а отрицательное значение шага изменяет порядок вывода символов на противоположный.
Давайте повторим эту команду, но используем шаг -2:
print(ss[::-2])
Output
!rh ma
В этом примере, ss[::-2]
, мы включаем в диапазон всю первоначальную строку, поскольку индексы не указаны, и задаем обратный порядок вывода отрицательным значением шага. Кроме того, с шагом -2 мы пропускаем каждую вторую букву строки, выводимой в обратном порядке:
! krahS[пробел]ymmaS
В этом примере выводится символ пробела.
Задавая третий параметр синтаксиса среза Python, мы указываем шаг подстроки, которую извлекаем из первоначальной строки.
Методы подсчета
Когда мы говорим об индексах символов в строках, стоит упомянуть о некоторых методах подсчета строк или вывода индексов. Это может быть полезно для того, чтобы ограничить количество символов, которые мы хотим включить в форму ввода, или чтобы сравнивать строки. Для подсчета строк, как и других символов последовательных данных, можно использовать несколько методов.
Вначале мы рассмотрим метод len()
, который поможет определить длину любого типа данных упорядоченной или неупорядоченной последовательности, включая строки, списки, кортежи и словари.
Давайте выведем длину строки ss
:
print(len(ss))
Output
12
Длина строки “Sammy Shark!” составляет 12 символов, включая символ пробела и символ восклицательного знака.
Вместо использования переменной мы также можем передать строку прямо в метод len()
:
print(len("Let's print the length of this string."))
Output
38
Метод len()
подсчитывает общее количество символов в строке.
Если нам нужно подсчитать, сколько раз в строке встречается определенный символ или последовательность символов, мы можем использовать метод str.count()
. Давайте возьмем нашу строку ss = "Sammy Shark!"
и подсчитаем, сколько раз в ней встречается символ “a”:
print(ss.count("a"))
Output
2
Мы можем поискать и другой символ:
print(ss.count("s"))
Output
0
Хотя в строке есть буква “S”, важно понимать, что при подсчете учитывается регистр. Если мы хотим найти все буквы в строке независимо от регистра, мы можем использовать метод str.lower()
, чтобы предварительно конвертировать все символы строки в нижний регистр. Вы можете узнать больше об этом методе в учебном модуле Введение в методы строк в Python 3.
Давайте попробуем использовать str.count()
с последовательностью символов:
likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
Output
3
В строке likes
последовательность символов, эквивалентная “likes”, встречается в исходной строке 3 раза.
Также мы можем определить позицию символа или последовательности символов в строке. Для этого мы можем использовать метод str.find()
, который выводит позицию символа на базе номера индекса.
Мы можем посмотреть, где появляется первый символ “m” в строке ss
:
print(ss.find("m"))
Ouput
2
Первый символ “m” появляется в строке “Sammy Shark!” на позиции с индексом 2. Мы можем проверить позиции индекса в строке ss
выше.
Давайте посмотрим, где встречается первая последовательность символов “likes” в строке likes
:
print(likes.find("likes"))
Ouput
6
Первый экземпляр последовательности символов “likes” начинается с индекса 6, соответствующего позиции символа l
в последовательности likes
.
Что делать, если, если мы хотим увидеть, где начинается вторая последовательность “likes”? Для этого мы можем передать второй параметр в метод str.find()
, который будет начинаться с конкретного индекса. Вместо того, чтобы начинать с начала строки, начнем с индекса 9:
print(likes.find("likes", 9))
Output
34
Во втором примере, который начинается с индекса 9, первая последовательность символов “likes” начинается с индекса 34.
Также мы можем указать в качестве третьего параметра конец диапазона. Как и в случае со срезами, мы можем использовать обратный отсчет, указав отрицательный индекс:
print(likes.find("likes", 40, -6))
Output
64
В последнем примере мы ищем позицию последовательности “likes” между индексами 40 и -6. Поскольку последний параметр отрицательный, отсчет выполняется с конца первоначальной строки.
Методы строки len()
, str.count()
и str.find()
можно использовать для определения длины, количества символов или последовательностей символов и индексов символов или последовательностей символов в строках.
Заключение
Возможность вызова определенных индексов строк или конкретного среза строки дает дополнительную гибкость при работе с этим типом данных. Поскольку строки относятся к последовательному типу данных, как списки и кортежи, для доступа к ним можно использовать индексы и срезы.
Чтобы продолжить изучение строк, вы можете прочитать дополнительные материалы по форматированию строк и методам строк.
Cрез строки Python от заданного символа/знака до конца строки.
Для нахождения позиции заданного символа воспользуемся методом строки str.find(x)
, который будет искать позицию x
. Если символа x
нет, то возвращаемый результат будет равен -1.
Срез строки s[a:b] — это кусок от положения a
включительно до b
, который не будет включен в результирующий срез. Если b
отсутствует, то строка будет от положения a
включительно до конца строки.
Метод str.find(":") + 1
— первый символ, входящий в новую строку. Если метод str.find()
вернёт результат -1, то тогда (-1 + 1 = 0) просто получим целиком всю строку.
Теперь пример среза строки Python от заданного символа до конца строки
>>> s = 'text text: one two three' >>> s[s.find(":") + 1:] # ' one two three'
Можно воспользоваться str.partition()
разбивает строку на три части: все что слева от разделителя, сам разделитель, то что справа от разделителя. Если разделитель не найден, то возвращается исходная строка и две пустых строки, т. е. в любом случае возвращается кортеж из 3 элементов.
>>> s = 'text text: one two three' >>> s.partition(':')[2] # ' one two three'
Обрезание строки Python до нужного символа/знака.
Можно воспользоваться str.partition()
разбивает строку на три части: все что слева от разделителя, сам разделитель, то что справа от разделителя. Если разделитель не найден, то возвращается исходная строка и две пустых строки, т. е. в любом случае возвращается кортеж из 3 элементов.
>>> s = 'text text: one two three' >>> s.partition(':')[0] # 'text text'
Или применить к строке метод str.split()
, который делит строку по указанному разделителю.
>>> s = 'text text: one two three' >>> s.split(':')[0] # 'text text'
Методы строк в Python для начинающих
Методы строк для начинающих
У строк в Python есть множество полезных методов для того, чтобы дать
возможность делать со строками различные полезные и нужные действия.
Методы похожи на функции, из тоже можно вызывать и, так же как и функции, они могут
возвращать результат своей работы. Отличие же методов в том, что они привязаны
к определенному типу данных и, например, методы строк могут быть вызваны только
у строк.
Все методы строк можно посмотреть в нашем справочнике, а вот несколько примеров того,
как вызывать методы строк.
string = "Hello world!"
print(string.lower()) # hello world!
print(string.upper()) # HELLO WORLD!
Начинающему программисту важно помнить, что методы не меняют исходную строку. Строки в Python
вообще нельзя изменить.
Если вы хотите поменять все ее символы, например, на символы нижнего регистра, нужно
присвоить строке новое значение
string = "Hello world!"
string = string.lower()
Индексы строк
Бывает так, что иногда появляется необходимость выбирать отдельные символы из строки. В Python для этого необходимо использовать квадратные скобки. В таблице ниже приведены примеры получения символа строки по индексу строки Python, помещенной в переменную string.
Код | Результат | Описание |
---|---|---|
s[0] | P | Первый символ |
s[1] | y | Второй символ |
s[-1] | n | Последний символ |
s[-2] | o | Предпоследний символ |
Как вы видите, необходимо учитывать, что номером индекса первого символа будет [0]
Отрицательный индекс будет отсчитывать символы с конца строки.
Распространенная ошибка: предположим, что мы пытаемся задать индекс s[12]. Но в примере выше мы имеем всего шесть элементов строки, и логично что Python выдаст ошибку следующего содержания:
IndexError: string index out of range
Срезы строк
Срез используется для выделения части строки. Он состоит из индекса и диапазона. Ниже расположены несколько примеров со строкой
string = 'абвгдежзик'
Индекс
0 1 2 3 4 5 6 7 8 9
Символ
а б в г д е ж з и к
Фрагмент кода | Результат | Описание |
---|---|---|
string[ 2 : 5 ] | вгд | Символы с индексом 2, 3, 4 |
string[ : 5 ] | абвгд | Первые пять символов |
string[ 5 : ] | ежзик | Символы, начиная с индекса 5 и до конца |
string[ −2 : ] | ик | Последние два символа |
string[ : ] | абвгдежзик | Вся строка |
string[1 : 7 : 2] | бге | Со второго по шестой символы, через один |
string[ : : −1 ] | кизжедгвба | Обратный шаг, строка наоборот |
Базовая структура среза выглядит следующим образом:
Строка[начальный_символ : конечный_символ + 1]
Срезы не включают явное расположение окончания строки. Например, в приведенном выше примере string[2 : 5], Python выведет символы с индексами 2, 3 и 4, но не символ с индексом 5.
Мы можем оставить, вместо индекса начала или окончания строки, пустоту. Пустота на месте индекса начала будет по умолчанию равна нулю. Итак, string[: 5] выведет первые пять символов строки string. А в случае string[5 :], Python покажет символы, начиная с индекса 5 и до конца строки. Если же использовать отрицательные индексы, мы получим символы с конца строки. Например, string[-2 :] — это последние два символа.
Также существует необязательный третий аргумент, который указывает на шаг среза строки. Например, string[1 : 7 : 2] берет каждый второй символ из строки с индексом 1, 3 и 5.
F-строки Python 3: улучшенный синтаксис форматирования строк
Начиная с Python 3.6, f-строки — отличный новый способ форматирования строк. Это способ не только более читабелен, более краток и менее подвержен ошибкам, чем другие способы форматирования, но и быстрее всех других!
К концу этой статьи вы узнаете, как и почему нужно использовать f-строки.
Но сначала, рассмотрим старые варианты вывода строк.
“Старая-школа” форматирования строк в Python
До Python 3.6 у нас было два основных способа встраивания выражений Python в строковые литералы для форматирования: % — форматирование и str.format(). Рассмотрим, как их использовать и каковы их ограничения.
Вариант #1: % — форматирование
Этот способ форматирования Python существует в языке с самого его начала. Вы можете прочитать о нем больше информации в документации по Python. Имейте в виду, что % — форматирование не рекомендуется к использованию:
Операции форматирования, описанные здесь, демонстрируют различные проблемы, которые приводят к ряду распространенных ошибок (таких как неправильное отображение кортежей и словарей).
Использование более новых форматированных строковых литералов или интерфейса str.format() помогает избежать этих ошибок. Эти альтернативы также предоставляют более мощные, гибкие и расширяемые подходы к форматированию текста. (Источник)
Как используется % — форматирование
Строковые объекты имеют встроенную операцию с использованием оператора %, который можно использовать для форматирования строк. Вот как это выглядит на практике:
>>> name = "Eric" >>> "Hello, %s." % name 'Hello, Eric.'
Чтобы вставить более одной переменной, вы должны использовать кортеж из этих переменных.
>>> name = "Eric" >>> age = 74 >>> "Hello, %s. You are %s." % (name, age) 'Hello Eric. You are 74.'
Недостатки % — форматирования
Примеры кода, которые вы только что видели выше, достаточно читабельны. Однако, как только вы начнете использовать несколько параметров и более длинные строки, ваш код быстро станет менее читаемым. Все начинает выглядеть немного грязно:
>>> first_name = "Eric" >>> last_name = "Idle" >>> age = 74 >>> profession = "comedian" >>> affiliation = "Monty Python" >>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation) 'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
К сожалению, этот вид форматирования не очень хорош, потому что он многословен и приводит к ошибкам, таким как неправильное отображение кортежей или словарей. К счастью, есть альтернативы.
Вариант #2: str.format()
Этот новый способ вывода строк был представлен в Python 2.6. Вы можете обратиться к документации Python для получения дополнительной информации.
Как используется str.format()
str.format() — это улучшение % — форматирования. Он использует обычный синтаксис вызова функции и расширяется с помощью метода __format__() для объекта, преобразуемого в строку.
С помощью str.format() поля вывода переменных отмечены фигурными скобками:
>>> "Hello, {}. You are {}.".format(name, age) 'Hello, Eric. You are 74.'
Вы можете ссылаться на переменные в любом порядке, ссылаясь по их индексам:
>>> "Hello, {1}. You are {0}.".format(age, name) 'Hello, Eric. You are 74.'
Но если вы вставите имена переменных, вы получите дополнительную возможность передавать объекты, а затем ссылаться на параметры и методы между фигурными скобками:
>>> person = {'name': 'Eric', 'age': 74} >>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age']) 'Hello, Eric. You are 74.'
Вы также можете использовать символ **, чтобы использовать этот трек со словарями:
>>> person = {'name': 'Eric', 'age': 74} >>> "Hello, {name}. You are {age}.".format(**person) 'Hello, Eric. You are 74.'
str.format() определенно является улучшением по сравнению с % — форматированием, но и у него есть свои недостатки.
В чем недостатки str.format()
Код, использующий str.format(), гораздо легче читается, чем код, использующий % -форматирование, но str.format() все еще может быть достаточно многословным, когда вы имеете дело с несколькими параметрами и более длинными строками. Посмотрите на это:
>>> first_name = "Eric" >>> last_name = "Idle" >>> age = 74 >>> profession = "comedian" >>> affiliation = "Monty Python" >>> print(("Hello, {first_name} {last_name}. You are {age}. " + >>> "You are a {profession}. You were a member of {affiliation}.") \ >>> .format(first_name=first_name, last_name=last_name, age=age, \ >>> profession=profession, affiliation=affiliation)) 'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'
Если у вас есть переменные, которые вы хотите передать в .format() в словаре, то вы можете просто распаковать его с помощью .format (** some_dict) и ссылаться на значения по ключу в строке.
f-Строки: новый и улучшенный способ форматирования строк в Python
f-строки были представлены в Python 3.6. Вы можете прочитать об этом в PEP 498, который был написан Эриком В. Смитом в августе 2015 года.
Также называемые «formatted string literals»(«отформатированные строковые литералы»), f-строки — это строковые литералы, которые имеют f в начале и фигурные скобки, содержащие выражения, которые будут заменены их значениями. Выражения оцениваются во время выполнения, а затем форматируются с использованием протокола format. Как всегда, документация Python — ваш друг, когда вы хотите получить больше информации.
Вот несколько способов, которыми f-строки могут сделать вашу жизнь проще.
Простой синтаксис
Синтаксис похож на тот, который вы использовали с str.format(), но менее подробный. Посмотрите, насколько легко это читается:
>>> name = "Eric" >>> age = 74 >>> f"Hello, {name}. You are {age}." 'Hello, Eric. You are 74.'
Также было бы правильно использовать заглавную букву F:
>>> F"Hello, {name}. You are {age}." 'Hello, Eric. You are 74.'
Ты еще не любишь f — строки? Я надеюсь, что к концу этой статьи вы ответите >>> F"Yes!"
Произвольные выражения
Поскольку f-строки оцениваются во время выполнения, вы можете поместить в них все допустимые выражения Python. Это позволяет вам делать некоторые изящные вещи.
Вы можете сделать что-то довольно простое, как это:
>>> f"{2 * 37}" '74'
Но вы также можете вызывать функции. Вот пример:
>>> def to_lowercase(input): ... return input.lower() >>> name = "Eric Idle" >>> f"{to_lowercase(name)} is funny." 'eric idle is funny.'
Вы также можете напрямую вызвать метод:
>>> f"{name.lower()} is funny." 'eric idle is funny.'
Вы даже можете использовать объекты, созданные из классов с f-строками. Представьте, что у вас есть следующий класс:
class Comedian: def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def __str__(self): return f"{self.first_name} {self.last_name} is {self.age}." def __repr__(self): return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"
Вы сможете сделать это:
>>> new_comedian = Comedian("Eric", "Idle", "74") >>> f"{new_comedian}" 'Eric Idle is 74.'
Методы __str__() и __repr__() имеют дело с тем, как объекты представляются в виде строк, поэтому вам необходимо убедиться, что вы включили хотя бы один из этих методов в определение класса. Если вам нужно выбрать один, используйте __repr__(), поскольку его можно использовать вместо __str__().
Строка, возвращаемая __str__(), является неформальным строковым представлением объекта и должна быть читабельной. Строка, возвращаемая __repr__(), является официальным представлением и должна быть однозначной. Вызов str() и repr() предпочтительнее прямого использования __str__ () и __repr__().
По умолчанию f-строки будут использовать __str__(), но вы можете убедиться, что они используют __repr__(), если вы включите флаг преобразования !r:
>>> f"{new_comedian}" 'Eric Idle is 74.' >>> f"{new_comedian!r}" 'Eric Idle is 74. Surprise!'
Если вы хотите прочитать больше, о f-строк которые поддерживают полные выражения Python, вы можете сделать это здесь.
Многострочные f-строки
Вы можете использовать многострочные строки:
>>> name = "Eric" >>> profession = "comedian" >>> affiliation = "Monty Python" >>> message = ( ... f"Hi {name}. " ... f"You are a {profession}. " ... f"You were in {affiliation}." ... ) >>> message 'Hi Eric. You are a comedian. You were in Monty Python.'
Но помните, что вам нужно поместить «f» перед каждой строкой многострочной строки. Следующий код не будет работать:
>>> message = ( ... f"Hi {name}. " ... "You are a {profession}. " ... "You were in {affiliation}." ... ) >>> message 'Hi Eric. You are a {profession}. You were in {affiliation}.'
Если вы хотите распределить строки по нескольким строкам, вы можете так же сделать это с помощью \:
>>> message = f"Hi {name}. " \ ... f"You are a {profession}. " \ ... f"You were in {affiliation}." ... >>> message 'Hi Eric. You are a comedian. You were in Monty Python.'
Или с помощью «»»:
>>> message = f""" ... Hi {name}. ... You are a {profession}. ... You were in {affiliation}. ... """ ... >>> message '\n Hi Eric.\n You are a comedian.\n You were in Monty Python.\n'
Скорость
Символ f в f — строках также может означать «быстро» (fast).
f-строки быстрее, чем % — форматирование и str.format(). Как вы уже видели, f-строки — это выражения, вычисляемые во время выполнения, а не постоянные значения. Вот выдержка из документов:
«f-строки обеспечивают способ встраивания выражений в строковые литералы, используя минимальный синтаксис. Следует отметить, что f-строка на самом деле является выражением, вычисляемым во время выполнения, а не постоянным значением. В исходном коде Python f-строка является литеральной строкой с префиксом f, которая содержит выражения внутри фигурных скобок. Выражения заменяются их значениями ». (Источник)
Во время выполнения выражение внутри фигурных скобок оценивается в собственной области видимости и затем помещается вместе со строковым литералом в часть f-строки. Полученная строка затем возвращается. Это все, что нужно.
Вот сравнение скорости:
>>> import timeit >>> timeit.timeit("""name = "Eric" ... age = 74 ... '%s is %s.' % (name, age)""", number = 10000) 0.003324444866599663
>>> timeit.timeit("""name = "Eric" ... age = 74 ... '{} is {}.'.format(name, age)""", number = 10000) 0.004242089427570761
>>> timeit.timeit("""name = "Eric" ... age = 74 ... f'{name} is {age}.'""", number = 10000) 0.0024820892040722242
Как вы можете видеть, f-строки выходят на первое место.
Тем не менее, это не всегда так. Когда они были впервые реализованы, у них были некоторые проблемы со скоростью, и их нужно было делать быстрее, чем str.format(). Был введен специальный код BUILD_STRING.
Python f-строки: особенности использования
Теперь, когда вы узнали все о том, почему f-строки великолепны, я уверен, что вы захотите начать их использовать. Вот несколько деталей, о которых нужно помнить, когда вы отправляетесь в этот дивный новый мир.
Кавычки
Вы можете использовать различные типы кавычек внутри выражений. Просто убедитесь, что вы не используете кавычки того же типа на внешней стороне f-строки, которые вы используете в выражении.
Этот код будет работать:
>>> f"{'Eric Idle'}" 'Eric Idle'
Этот код также будет работать:
>>> f'{"Eric Idle"}' 'Eric Idle'
Вы также можете использовать тройные кавычки:
>>> f"""Eric Idle""" 'Eric Idle'
>>> f'''Eric Idle''' 'Eric Idle'
Если вам нужно использовать одинаковый тип кавычки как внутри, так и снаружи строки, вы можете сделать это с помощью \:
>>> f"The \"comedian\" is {name}, aged {age}." 'The "comedian" is Eric Idle, aged 74.'
Словари
Говоря о кавычках, следите, когда вы работаете со словарями. Если вы собираетесь использовать одинарные кавычки для ключей словаря, то не забудьте убедиться, что вы используете двойные кавычки для f-строк, содержащих ключи.
>>> comedian = {'name': 'Eric Idle', 'age': 74} >>> f"The comedian is {comedian['name']}, aged {comedian['age']}." The comedian is Eric Idle, aged 74.
Пример с синтаксической ошибкой:
>>> comedian = {'name': 'Eric Idle', 'age': 74} >>> f'The comedian is {comedian['name']}, aged {comedian['age']}. SyntaxError: invalid syntax
Если вы используете тот же тип кавычки вокруг ключей словаря, что и на внешней стороне f-строки, то кавычка в начале первого ключа словаря будет интерпретироваться как конец строки.
Фигурные скобки
Чтобы в скобках появилась скобка, вы должны использовать двойные скобки:
>>> f"{{74}}" '{74}'
Обратите внимание, что использование тройных скобок приведет к тому, что в вашей строке будут только одиночные скобки:
>>> f"{{{74}}}" '{74}'
Тем не менее, вы можете получить больше фигурных скобок, если вы используете больше, чем тройные фигурные скобки:
>>> f"{{{{74}}}}" '{{74}}'
Обратный слеш
Как вы видели ранее, вы можете использовать обратные слэши в строковой части f-строки.
SyntaxError: f-string expression part cannot include ‘#’
Заключение
Вы по-прежнему можете использовать более старые способы форматирования строк, но с f-строками у вас теперь есть более лаконичный, читаемый и удобный способ, который быстрее и менее подвержен ошибкам. Упрощение вашей жизни с помощью f-строк — отличная причина начать использовать Python 3.6, если вы еще не сделали этого. (Если вы все еще используете Python 2, не забудьте, что 2020 скоро наступит!)
Согласно Zen of Python, когда вам нужно решить, как что-то сделать, должен быть один — и предпочтительно только один — очевидный способ сделать это. Хотя f-строки не единственный возможный способ отформатировать строки, они в состоянии стать тем очевидным и единственным способом сделать эту работу.
Дальнейшее чтение
Если вы хотите прочитать расширенное обсуждение интерполяции строк, взгляните на PEP 502. Кроме того, в черновике PEP 536 есть еще несколько мыслей о будущем f-строк.
Оригинальная статья by Joanna Jablonski Python 3’s f-Strings: An Improved String Formatting Syntax (Guide)
Была ли вам полезна эта статья?
Строки в Python | PyLab
Строкой является любой фрагмент текста. Python не различает строку, которая является одиночным символом или большим блоком текста. Из-за множества способов, которые Python предоставляет для работы со строками, это идеальный язык для обработки текста.
Название «строка», вероятно, связано с тем, что языки программирования часто трактуют текст как последовательность символов, «набранных» вместе.
Python имеет два разных типа строк.
Базовый тип строки (обычные строки) сохраняет текст как последовательность байтов (чисел) с одним байтом на символ. Они должны использоваться только в том случае, если вы знаете, что в вашем тексте будут только значения ASCII. Они очень удобны в использовании, поэтому многие программы просто используют этот тип строки. Их также можно использовать для хранения двоичных данных. Они иногда называются байтовыми строками, что является довольно хорошим описанием того, что они делают.
Строки в Unicode хранят текст внутренне, используя стандарт unicode. Они немного сложнее, потому что вы должны знать «кодировку», в которой текст хранится всякий раз, когда вы читаете текст или сохраняете его. В конечном счете это может сэкономить много времени и избежать путаницы.
Ниже представлен обзор двух разных типов строк и их включение в ваши программы.
Обычные строки
Вы включаете строку в свою программу, окружая ее одинарными кавычками или двойными кавычками:
X = ‘Это строка’
Y = “И это так”.
Если вы хотите включить строку в свой код («строковый литерал»), в котором есть разрывы строк, вы можете использовать тройные кавычки. Кавычки могут быть одинарные или двойные.
x = """This string goes over multiple lines. So it includes line breaks.""" y = '''This string uses single quotes. But it is still multi-line. As you might have guessed.'''
Если вам нужно включить в строку специальные символы (например, разрывы строк или кавычки), то вы можете использовать экранированные символы. Python следует соглашению Unix об использовании обратной косой черты в качестве символа экранирования. Например:
x = '\n' y = 'Don\'t worry about quotes' z = '\'
Если вы хотите включить в свои строки обратные косые черты, не избегая их, вы можете использовать «сырую строку». Если вы начинаете строковой литерал в коде с помощью r, это необработанная строка.
Поскольку сырые строки предназначены для использования в регулярных выражениях, а не для указания путей к файлам Windows, они не могут заканчиваться обратным слэшем.
raw_string = r'a raw string may contain unescaped \s in it'
Обратная косая черта будет интерпретирована как экранирование сопровождающей ее кавычки, а также ее включение в строку. Раздражающий и не очень полезный, но у каждого бывают свои недостатки.
Строки Python хранятся с использованием чисел. Они не кодируются с использованием какой-либо кодировки. Интерпретатор просто получает то, что вы ему даете, и сохраняет его в виде последовательности байтов. По этой причине базовые строки часто упоминаются как «байтовые строки». Вы также можете использовать их для хранения двоичных данных.
Поскольку они хранятся в байтах, строковые литералы (в вашей программе) должны содержать только символы ASCII. Вы можете включить не-ASCII, объявив кодировку в начале вашей программы, но вы должны делать это только если знаете, что делаете.
Если вы намереваетесь использовать (или разрешать пользователям использовать) символы не-ASCII в вашей программе, то сохранение строк без указания кодировки вызывает проблемы. Если вы не будете очень осторожны, вы, вероятно, неправильно обработаете текст и исказите ваши данные. Гораздо лучше использовать строки unicode, которые кратко описаны ниже.
Строки Unicode
Как упоминалось выше, «обычные строки» в Python являются байтовыми строками и хранят данные в виде последовательности чисел. Это может быть очень удобно для текста ASCII, но как только вы используете символы, отличные от ASCII, то возникают соответствующие проблемы.
Для хорошего «руководства» по использованию Unicode с Python читайте A Crash Course в кодировках символов.
Строки в Unicode имеют внутреннее представление, которое сохраняет текст как текст. Фактически, компьютер знает, какие символы сравнивает ваш текст. Вам все равно придется выбирать кодировку, когда вы читаете или записываете свои данные.
Вы можете включить литералы unicode в свою программу, указав строку u. Если вы не укажете кодировку в начале вашей программы, вам все равно придется использовать только символы ASCII, но вы знаете, что ваша строка будет храниться как unicode, а не как строка байтов.
Правила цитирования и экранирования для строк в Юникоде такие же, как для строк байтов:
x = u'A unicode string' y = u'''A multi-line unicode string.''' y = ru"""This is a raw, multi-line unicode string !!! """
Вы можете принудить интерпретатор Python к конвертированию между unicode и byte-strings без указания явной кодировки, но скорее всего это повлечет за собой крах системы. Это может произойти, когда одна из строк, которую вы “неявно” преобразуете, (например, добавив строку юникода в строку байтов) имеет символы, которые не могут быть представлены в кодировке системы по умолчанию (которая обычно будет ASCII).\
В строках Python, как и в других встроенных типах, есть много полезных методов для работы со строковыми типами. Полный список приведен в строковых методах документов Python.
Другие полезные значения
Есть еще несколько полезных значений, которые могут пригодиться.
None: часто записываемый как null в других языках, обычно используется для представления «ничего».
True: логическое значение истина.
False: логическое значение ложь.
Можно включить эти значения включить в свою программу, написав буквально:
x = None y = True z = None
Поделитесь с друзьями:
Python Удалить последние 3 символа строки Ru Python
Я пытаюсь удалить последние 3 символа из строки в python, я не знаю, что эти символы, поэтому я не могу использовать rstrip
, мне также нужно удалить любое свободное пространство и преобразовать в верхний регистр
примером может служить:
foo = "Bs12 3ab" foo.replace(" ", "").rstrip(foo[-3:]).upper()
Это работает и дает мне BS12, который я хочу, однако, если последние 4-й и 3-й символы одинаковы, я foo = "BS11 1AA"
как, например, если foo = "BS11 1AA"
я просто получаю 'BS'
примерами foo
могут быть:
BS1 1AB bs11ab BS111ab
Строка может быть 6 или 7 символов, и мне нужно отбросить последние 3 (без пробелов)
Какие-нибудь советы?
Это не работает так, как вы ожидаете, потому что полоса является символом. Вам нужно сделать это вместо этого:
foo = foo.replace(' ', '')[:-3].upper()
Удаление всех пробелов:
foo = ''.join(foo.split())
Удаление последних трех символов:
foo = foo[:-3]
Преобразование в заглавные буквы:
foo = foo.upper()
Весь этот код в одной строке:
foo = ''.join(foo.split())[:-3].upper()
>>> foo = "Bs12 3ab" >>> foo[:-3] 'Bs12 ' >>> foo[:-3].strip() 'Bs12' >>> foo[:-3].strip().replace(" ","") 'Bs12' >>> foo[:-3].strip().replace(" ","").upper() 'BS12'
Возможно, вы неправильно поняли Rstrip, он не строит строку, а любой символ в указанной вами строке.
Как это:
>>> text = "xxxxcbaabc" >>> text.rstrip("abc") 'xxxx'
Поэтому вместо этого просто используйте
text = text[:-3]
(после замены пробела ничем)
Что случилось с этим?
foo.replace(" ", "")[:-3].upper()
>>> foo = 'BS1 1AB' >>> foo.replace(" ", "").rstrip()[:-3].upper() 'BS1'
Я стараюсь избегать регулярных выражений, но это работает:
string = re.sub("\s","",(string.lower()))[:-3]
Вы не выполняете операции в неправильном порядке? Требование, похоже, foo[:-3].replace(" ", "").upper()
Это зависит от вашего определения пробелов. Обычно я называл бы пробелы пробелами, вкладками, разрывами строк и возвратами каретки. Если это ваше определение, вы хотите использовать регулярное выражение с \ s для замены всех символов пробелов:
import re def myCleaner(foo): print 'dirty: ', foo foo = re.sub(r'\s', '', foo) foo = foo[:-3] foo = foo.upper() print 'clean:', foo print myCleaner("BS1 1AB") myCleaner("bs11ab") myCleaner("BS111ab")
Python 3 Строковые операторы
Список строковых операторов, доступных в Python 3.
Оператор | Описание | Операция | Пример | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+ | Объединяет (объединяет) строка1 и строка2 | строка1 + строка2 | a = «Чай» + «Лист» Результат Чайный лист | ||||||||||||||||||||||||||||
* | Повторяет строку столько раз, сколько указано в x | строка * x | a = «Пчела» * 3 Результат Пчела Пчела Пчела | ||||||||||||||||||||||||||||
[] | Slice — возвращает символ из указанного индекса с размером x . | строка [x] | a = «Море» Результат e | ||||||||||||||||||||||||||||
[:] | Range Slice — возвращает символы из диапазона, указанного в x: y . | строка [x: y] | a = «Гриб» Результат комн. | ||||||||||||||||||||||||||||
дюйм | Membership — возвращает True , если в строке существует x .Может быть несколько символов. | х в строке | a = «Гриб» Результат Верно Ложь Правда | ||||||||||||||||||||||||||||
кроме | Membership — возвращает True , если x не не существует в строке. Может быть несколько символов. | x не в строке | a = «Гриб» Результат Ложь Правда Ложь | ||||||||||||||||||||||||||||
r | Подавляет escape-последовательность ( \ x ), чтобы она действительно отображалась. Другими словами, это предотвращает превращение escape-символа в escape-символ. | r "\ x" | a = «1» + «\ t» + «Пчела» Результат 1 пчела 2 \ t Чай | ||||||||||||||||||||||||||||
% | Выполняет форматирование строк. Его можно использовать в качестве заполнителя для другого значения, вставляемого в строку.Символ
| % x | a = «Привет,% s»% («Гомер») Результат Привет Гомер |
«Введение в работу со строками» в «Как кодировать на Python 3» на стипендии Manifold Scholarship в CUNY
Строка представляет собой последовательность из одного или нескольких символов (букв, цифр, символов), которые могут быть константами. или переменная.Строки, состоящие из Unicode, являются неизменяемыми последовательностями, то есть неизменными.
Поскольку текст — это очень распространенная форма данных, которую мы используем в повседневной жизни, строковый тип данных является очень важным строительным блоком программирования.
Это руководство по Python расскажет, как создавать и печатать строки, как объединять и реплицировать строки и как хранить строки в переменных.
Создание и печать строк
Строки существуют либо в одинарных кавычках '
, либо в двойных кавычках "
в Python, поэтому для создания строки заключите последовательность символов в один или другой:
' Это строка в одинарных кавычках.'
«Это строка в двойных кавычках».
Вы можете использовать одинарные или двойные кавычки, но, что бы вы ни выбрали, вы должны быть последовательными в программе.
Мы можем распечатать строки, просто вызвав функцию print ()
:
print («Давайте распечатаем эту строку.»)
Выход
Распечатаем эту строку.
Понимая, как форматируются строки в Python, давайте посмотрим, как мы можем работать со строками и манипулировать ими в программах.
Конкатенация строк
Конкатенация означает сквозное соединение строк для создания новой строки. Для объединения строк мы используем оператор +
. Имейте в виду, что когда мы работаем с числами, +
будет оператором сложения, но при использовании со строками это оператор соединения.
Давайте объединим строки "Sammy"
и "Shark"
вместе с конкатенацией посредством оператора print ()
:
print ("Sammy" + "Shark")
Выход
SammyShark
Если нам нужен пробел между двумя строками, мы можем просто включить пробел в строку, например, после слова «Сэмми»:
print («Sammy» + «Shark»)
Выход
Sammy Shark
Не используйте оператор +
между двумя разными типами данных.Например, мы не можем объединить строки и целые числа вместе. Итак, если мы попытаемся написать:
print ("Sammy" + 27)
Мы получим следующую ошибку:
Выход
TypeError: невозможно неявно преобразовать объект int в str
Если бы мы хотели создать строку «Sammy27»
, мы могли бы сделать это, заключив число 27
в кавычки ( «27»
), так что это уже не целое число, а строка. Преобразование чисел в строки для объединения может быть полезно при работе с почтовыми индексами или номерами телефонов, например, поскольку мы не хотим выполнять сложение между кодом страны и кодом города, но мы хотим, чтобы они оставались вместе.
Когда мы объединяем две или более строк посредством конкатенации, мы создаем новую строку, которую можем использовать в нашей программе.
Репликация строки
Бывают случаи, когда вам нужно использовать Python для автоматизации задач, и один из способов сделать это — повторить строку несколько раз. Сделать это можно с помощью оператора *
. Подобно оператору +
, оператор *
имеет другое использование при использовании с числами, где он является оператором умножения.При использовании с одной строкой и одним целым числом *
— это оператор репликации строки , повторяющий одну строку сколько угодно раз через указанное вами целое число.
Давайте распечатаем «Сэмми» 9 раз, не набирая «Сэмми» 9 раз с помощью оператора *
:
print («Сэмми» * 9)
Выход
SammySammySammySammySammySammySammySammySammy
При репликации строки мы можем повторять одиночное строковое значение количество раз, эквивалентное целочисленному значению.
Сохранение строк в переменных
Переменные — это символы, которые можно использовать для хранения данных в программе. Вы можете думать о них как о пустом поле, которое вы заполняете некоторыми данными или значениями. Строки — это данные, поэтому мы можем использовать их для заполнения переменной. Объявление строк как переменных может облегчить нам работу со строками в наших программах Python.
Чтобы сохранить строку внутри переменной, нам просто нужно присвоить переменную строке. В этом случае давайте объявим my_str
в качестве нашей переменной:
my_str = "Сэмми любит объявлять строки."
Теперь, когда у нас есть переменная my_str
, установленная для этой конкретной строки, мы можем напечатать переменную следующим образом:
print (my_str)
И мы получим следующий результат:
Выход
Сэмми любит объявлять строки.
Используя переменные вместо строк, нам не нужно повторно вводить строку каждый раз, когда мы хотим ее использовать, что упрощает нам работу со строками и манипулирование ими в наших программах.
Заключение
В этом руководстве были рассмотрены основы работы со строковым типом данных в языке программирования Python 3. Создание и печать строк, объединение и репликация строк и хранение строк в переменных предоставят вам основы для использования строк в ваших программах на Python 3.
Чтобы продолжить изучение строк, ознакомьтесь со следующими руководствами: — Как форматировать текст в Python 3 — Введение в строковые функции — Как индексировать и нарезать строки — Как использовать средства форматирования строк
Как и зачем использовать f строк в Python3 | Рахул Агарвал
Позвольте мне объяснить это на простом примере.Предположим, у вас есть переменные, и вы хотите распечатать их в операторе.
name = 'Andy'
age = 20
print (?)
--------------------------------- -------------------------------
Вывод: Я Энди. Мне 20 лет.
Вы можете сделать это по-разному:
a) Объединить: Очень наивный способ — просто использовать +
для объединения в функции печати. Но это неуклюже. Нам нужно будет преобразовать наши числовые переменные в строку и позаботиться о пробелах при конкатенации.И это выглядит не очень хорошо, поскольку читаемость кода немного страдает, когда мы его используем.
name = 'Andy'
age = 20
print («Я» + имя + «. Я» + str (возраст) + «лет»)
------------ -------------------------------------------------- -
Я Энди. Мне 20 лет.
Источник: Pixabay
б)% Формат: Второй вариант — использовать форматирование %
. Но и здесь есть свои проблемы. Во-первых, это не читается. Вам нужно будет посмотреть на первый % s
и попытаться найти соответствующую переменную в списке в конце.И представьте, что у вас есть длинный список переменных, которые вы, возможно, захотите распечатать.
print ("Я% s. Мне% s лет"% (имя, возраст))
c) str.format (): Далее идет способ, который использовался в большинстве кодов Python 3 и стал стандартом печати на Python. Использование str.format ()
print ("Мне {}. Мне {} лет" .format (имя, возраст))
Здесь мы используем {} для обозначения заполнителя объекта в списке . У него все еще та же проблема с читабельностью, но мы также можем использовать str.формат
:
print ("Я {имя}. Мне {возраст} лет" .format (name = name, age = age))
Если это кажется слишком повторяющимся, мы также можем использовать словари:
data = {'name': 'Andy', 'age': 20}
print ("Я {имя}. Мне {age} лет" .format (** data))
На этой странице: комментирование с #, многострочные строки с «» «» «», печать нескольких объектов, обратная косая черта «\» в качестве escape-символа, ‘\ t’, ‘\ n’, ‘\ r’ и ‘\\’. ВидеоурокСводка видео
Узнать больше
ПрактикаЕсть как минимум три способа напечатать «Я очень люблю». Кто они такие? Попробуйте в оболочке IDLE. Вы можете использовать три разных разделителя строк: «,» и «» «. Обратите внимание, что апостроф необходимо экранировать с помощью символа «\» при использовании ‘в качестве разделителя.
Есть как минимум три способа напечатать Fleas, Adam, Had’em (самое короткое английское стихотворение, когда-либо написанное) в трех отдельных строках, используя одну функцию print ().Кто они такие? Попробуйте в оболочке IDLE. Опять же, вы можете использовать три разных разделителя строк: «,» и «» «.
Исследуйте |
строк — изучение Python 3
Строка может быть прочитана из стандартного ввода с помощью функции input ()
или определяется в одинарных или двойных кавычках.Две строки могут быть объединены, и мы
также может повторять строку n раз, умножая ее на целое число:
Нет
print ('> _ <' * 5) #> _ <> _ <> _ <> _ <> _ <
Строка в Python - это последовательность символов. Функция len (some_string)
возвращает количество символов в строке:
Нет
print (len ('abcdefghijklmnopqrstuvwxyz')) # 26
Каждый объект в Python можно преобразовать в строку с помощью функции str (some_object)
.Таким образом, мы можем преобразовывать числа в строки:
Нет
с = str (2 ** 100) печать # 1267650600228229401496703205376 print (len (s)) # 31
Реклама от Google, может быть основана на ваших интересах
Срез дает из данной строки один символ или некоторый фрагмент:
подстрока или подпоследовательность.
Есть три формы ломтиков. Самая простая форма среза: одиночный символ.
срез S [i]
дает i
-й символ строки.Считаем символы начиная
с 0. То есть, если S = 'Hello'
,
S [0] == 'H'
, S [1] == 'e'
, S [2] == 'l'
,
S [3] == 'l'
, S [4] == 'o'
.
Обратите внимание, что в Python нет отдельного типа для символов строки. S [i]
также имеет тип str
, как и исходная строка.
Номер i
в S [i]
называется индексом .
Если указать отрицательный индекс, то он засчитывается
с конца, начиная с номера -1
.То есть S [-1] == 'o'
,
S [-2] == 'l'
, S [-3] == 'l'
, S [-4] == 'e'
,
S [-5] == 'H'
.
Обобщим в таблице:
Строка S | H | и | л | л | или |
---|---|---|---|---|---|
Индекс | S [0] | S [1] | S [2] | S [3] | S [4] |
Индекс | S [-5] | S [-4] | S [-3] | S [-2] | S [-1] |
Если индекс в срезе S [i]
больше или равен len (S)
,
или меньше -len (S)
, возникает следующая ошибка IndexError: индекс строки вне диапазона
.
Реклама от Google, может быть основана на ваших интересах
Срез с двумя параметрами S [a: b]
возвращает подстроку длиной b - a
,
начиная с символа с индексом a
и
продолжительностью до символа с индексом b
, не считая последнего.
Например, S [1: 4] == 'ell'
, и вы можете получить ту же подстроку, используя S [-4: -1]
.
В одном срезе можно смешивать положительные и отрицательные индексы, например S [1: -1]
-
подстрока без первого и последнего символа строки (срез начинается с символа с индексом 1 и
оканчивается индексом -1, не включая его).
Срезы с двумя параметрами никогда не вызывают IndexError
. Например, для S == 'Hello'
срез S [1: 5]
возвращает строку 'ello'
, и результат будет таким же, даже
если второй индекс очень большой, например
S [1: 100]
.
Если вы опустите второй параметр (но сохраните двоеточие),
затем кусочек переходит в конец строки. Например, чтобы удалить
первый символ из строки (его индекс 0)
возьмите срез S [1:]
.сходным образом
если вы опустите первый параметр, Python берет срез с начала строки.
То есть, чтобы удалить последний символ из строки, вы можете использовать срез
S [: - 1]
. Срез S [:]
соответствует строке
S
сам.
Реклама от Google, может быть основана на ваших интересах
Любой фрагмент строки создает новую строку и никогда не изменяет исходную.
В Python строки неизменяемы, т.е.е они не могут быть изменены как объекты.
Вы можете присвоить переменную только новой строке, но старая останется в памяти.
Фактически в Python нет переменных. Есть только имена, которые связаны с какими-либо объектами.
Вы можете сначала связать имя с одним объектом, а затем - с другим. Может несколько имен
быть ассоциированным с одним и тем же объектом.
Покажем, что:
Нет
s = 'Привет' t = s # s и t указывают на одну и ту же строку t = s [2: 4] # теперь t указывает на новую строку 'll' print (s) # выводит 'Hello', поскольку s не изменилось print (t) # выводит 'll'
Реклама от Google, может быть основана на ваших интересах
Если вы указываете срез с тремя параметрами S [a: b: d]
,
третий параметр указывает шаг, как и для функции
диапазон ()
.В этом случае берутся только символы со следующим индексом:
a
a + d
, a + 2 * d
и так далее, пока и не
включая символ с индексом b
.
Если третий параметр равен 2, срез занимает
каждый второй символ, и если шаг среза равен
-1
, символы идут в обратном порядке.
Например, вы можете перевернуть строку следующим образом: S [:: - 1]
.
Посмотрим на примеры:
Нет
s = 'abcdefg' печать (s [1]) печать (s [-1]) печать (s [1: 3]) печать (s [1: -1]) печать (s [: 3]) печать (s [2:]) печать (s [: - 1]) печать (s [:: 2]) печать (s [1 :: 2]) печать (s [:: - 1])
Обратите внимание, как третий параметр среза похож на третий параметр функции range ()
:
Нет
s = 'abcdefghijklm' печать (s [0: 10: 2]) для i в диапазоне (0, 10, 2): print (i, s [i])
Реклама от Google, может быть основана на ваших интересах
Метод - это функция, привязанная к объекту.Когда вызывается метод,
метод применяется к объекту и выполняет некоторые вычисления, связанные с ним.
Методы вызываются как имя_объекта. Имя_метода (аргументы)
.
Например, в s.find ("e")
строковый метод find ()
применяется к
строка s
с одним аргументом "e"
.
Метод find ()
ищет подстроку, переданную в качестве аргумента,
внутри строки, в которой он вызывается.
Функция возвращает индекс первого вхождения подстроки.Если подстрока не найдена, метод возвращает -1.
Нет
s = 'Привет' печать (s.find ('e')) # 1 печать (s.find ('ll')) # 2 печать (s.find ('L')) # -1
Аналогично, метод rfind ()
возвращает индекс последнего вхождения
подстроки.
Нет
s = 'абракадабра' печать (s.find ('b')) # 1 печать (s.rfind ('b')) # 8
Если вы вызываете find ()
с тремя аргументами
s.find (подстрока, слева, справа)
, поиск выполняется
внутри среза сек [слева: справа]
.Если вы укажете только два аргумента, например
s.find (подстрока, слева)
, поиск выполняется
в срезе с [left:]
, то есть начиная с символа по индексу
осталось
до конца строки. Метод s.find (подстрока, слева, справа)
возвращает абсолютный индекс относительно всей строки s
, а не фрагмента.
Нет
s = 'Меня зовут Бонд, Джеймс Бонд, хорошо?' печать (s.find ('связь')) # 11 print (s.find ('связь', 12)) # 23
Реклама от Google, может быть основана на ваших интересах
Метод replace ()
заменяет все вхождения данной подстроки на другую.Синтаксис:
s.replace (old, new)
берет строку S
и заменяет
все вхождения подстроки старый
с подстрокой новый
. Пример:
Нет
print ('бар - это, по сути, бар'. Replace ('bar', 'pub')) # 'паб - это по сути паб'
Можно передать третий аргумент count
, например: s.replace (old, new, count)
.
Он заставляет replace ()
заменять только первые , считая
вхождений, а затем останавливаться.
Нет
print ('бар - это, по сути, бар'. Replace ('bar', 'pub', 1)) # 'паб - это, по сути, бар'
Реклама от Google, может быть основана на ваших интересах
Этот метод подсчитывает количество вхождений одной строки в другую. Простейший
форма такая: s.count (подстрока)
. Учитываются только неперекрывающиеся вхождения:
Нет
print ('Абракадабра'.счет ('а')) # 4 print (('aaaaaaaaaa'). count ('aa')) # 5
Если указать три параметра s.count (substring, left, right)
,
подсчет выполняется в сегменте с [слева: справа]
.
Реклама от Google, может быть основана на ваших интересах
Реклама от Google, может быть основана на ваших интересах
строк - погружение в Python 3
строк - погружение в Python 3
Вы здесь: Домой ‣ Погрузитесь в Python 3 ‣
Уровень сложности: ♦♦♦ ♢♢
❝ Я говорю тебе это, потому что ты один из моих друзей.
Мой алфавит начинается там, где заканчивается твой алфавит! №
- Доктор Сьюз, По ту сторону зебры!
Некоторые скучные вещи, которые вам нужно понять, прежде чем вы сможете погрузиться в воду
Мало кто задумывается об этом, но текст невероятно сложен. Начнем с алфавита. У жителей Бугенвиля самый маленький алфавит в мире; их алфавит Rotokas состоит всего из 12 букв: A, E, G, I, K, O, P, R, S, T, U и V. На другом конце спектра такие языки, как китайский, японский и В корейском есть тысячи символов.В английском языке, конечно же, 26 букв - 52, если считать прописные и строчные отдельно - плюс несколько ! @ # $% И знаков препинания.
Когда вы говорите о «тексте», вы, вероятно, имеете в виду «символы и символы на экране моего компьютера». Но компьютеры не работают с буквами и символами; они имеют дело с битами и байтами. Каждый фрагмент текста, который вы когда-либо видели на экране компьютера, на самом деле хранится в определенной кодировке символов . Грубо говоря, кодировка символов обеспечивает соответствие между тем, что вы видите на экране, и тем, что ваш компьютер фактически хранит в памяти и на диске.Существует множество различных кодировок символов, некоторые из которых оптимизированы для определенных языков, таких как русский, китайский или английский, а другие могут использоваться для нескольких языков.
На самом деле все намного сложнее. Многие символы являются общими для нескольких кодировок, но каждая кодировка может использовать различную последовательность байтов для фактического хранения этих символов в памяти или на диске. Таким образом, вы можете рассматривать кодировку символов как своего рода ключ дешифрования. Когда кто-то дает вам последовательность байтов - файл, веб-страницу или что угодно - и заявляет, что это «текст», вам нужно знать, какую кодировку символов они использовали, чтобы вы могли декодировать байты в символы.Если они дадут вам неправильный ключ или вообще не дадут ключа, перед вами останется незавидная задача - взломать код самостоятельно. Скорее всего, вы ошибетесь, и результат будет тарабарщиной.
Все, что вы думали, что знаете о струнах, неверно.
Вы наверняка видели подобные веб-страницы со странными знаками вопроса, похожими на знаки вопроса, вместо апострофов. Обычно это означает, что автор страницы неправильно объявил свою кодировку символов, ваш браузер оставил догадки, и в результате получилось сочетание ожидаемых и неожиданных символов.На английском это просто раздражает; на других языках результат может быть совершенно нечитаемым.
Существуют кодировки символов для всех основных языков мира. Поскольку каждый язык индивидуален, а память и дисковое пространство исторически были дорогими, каждая кодировка символов оптимизирована для конкретного языка. Под этим я подразумеваю, что каждая кодировка использует одни и те же числа (0–255) для представления символов этого языка. Например, вы, вероятно, знакомы с кодировкой ASCII , в которой английские символы хранятся в виде чисел от 0 до 127.(65 - заглавная «А», 97 - строчная «а», и с.) Английский имеет очень простой алфавит, поэтому его можно полностью выразить менее чем с помощью 128 цифр. Для тех из вас, кто умеет считать по основанию 2, это 7 из 8 бит в байте.
В
западноевропейских языках, таких как французский, испанский и немецкий, букв больше, чем в английском. Или, точнее, у них есть буквы в сочетании с различными диакритическими знаками, например, символы –
в испанском языке. Наиболее распространенной кодировкой для этих языков является CP-1252, также называемая «windows-1252», поскольку она широко используется в Microsoft Windows.Кодировка CP-1252 разделяет символы с ASCII в диапазоне 0–127, но затем расширяется до диапазона 128–255 для таких символов, как n-with-a-tilde-over-it (241), u-with-two. -точки над ним (252), и c. Однако это все еще однобайтовая кодировка; максимально возможное число 255 по-прежнему умещается в одном байте.
Кроме того, существуют такие языки, как китайский, японский и корейский, в которых так много символов, что для них требуются многобайтовые наборы символов. То есть каждый «символ» представлен двухбайтовым числом от 0 до 65535.Но разные многобайтовые кодировки по-прежнему имеют ту же проблему, что и разные однобайтовые кодировки, а именно то, что каждая из них использует одни и те же числа для обозначения разных вещей. Просто диапазон чисел шире, потому что символов для представления гораздо больше.
Это было нормально в мире, не связанном с сетью, где «текст» - это то, что вы набираете сами и иногда печатаете. Не было много «простого текста». Исходный код был ASCII , а все остальные использовали текстовые процессоры, которые определили свои собственные (нетекстовые) форматы, которые отслеживали информацию о кодировке символов вместе с богатым стилем, и c.Люди читают эти документы с помощью той же программы обработки текста, что и первоначальный автор, так что все более или менее работало.
А теперь подумайте о росте глобальных сетей, таких как электронная почта и Интернет. Множество «обычного текста», летающего по всему миру, создаются на одном компьютере, передаются через второй компьютер и принимаются и отображаются на третьем компьютере. Компьютеры могут видеть только числа, но числа могут означать разные вещи. О, нет! Что делать? Что ж, системы должны были быть спроектированы так, чтобы нести кодированную информацию вместе с каждым фрагментом «простого текста».Помните, что это ключ дешифрования, который преобразует читаемые компьютером числа в символы, читаемые человеком. Отсутствующий ключ дешифрования означает искаженный текст, тарабарщину или что-то еще хуже.
А теперь подумайте о попытке сохранить несколько фрагментов текста в одном месте, например, в одной таблице базы данных, в которой хранятся все сообщения электронной почты, которые вы когда-либо получали. Вам по-прежнему необходимо сохранять кодировку символов рядом с каждым фрагментом текста, чтобы вы могли правильно отображать его. Думаешь, это сложно? Попробуйте выполнить поиск в своей базе данных электронной почты, что означает преобразование нескольких кодировок на лету.Разве это не весело?
Теперь подумайте о возможности многоязычных документов, где символы нескольких языков расположены рядом друг с другом в одном документе. (Подсказка: программы, которые пытались это сделать, обычно использовали escape-коды для переключения «режимов». Пуф, вы в русском режиме koi8-r, поэтому 241 означает Я; пуф, теперь вы в греческом режиме Mac, поэтому 241 означает ώ.) И, конечно же, вы захотите найти и те документы.
А теперь много плачьте, потому что все, что, как вы думали, вы знали о строках, неверно, и не существует такой вещи, как «обычный текст.”
⁂
Юникод
Введите Unicode .
Unicode - это система, предназначенная для представления на каждые символа из на каждом языке. Юникод представляет каждую букву, символ или идеограмму как 4-байтовое число. Каждое число представляет собой уникальный символ, используемый как минимум в одном из языков мира. (Используются не все числа, но их больше 65 535, поэтому двух байтов будет недостаточно.) Символы, которые используются на нескольких языках, обычно имеют одно и то же число, если нет веской этимологической причины не делать этого.Тем не менее, на каждый символ приходится ровно 1 число и ровно 1 символ на число. Каждое число всегда означает только одно; нет никаких «режимов», за которыми нужно следить. U + 0041
всегда означает 'A'
, даже если в вашем языке нет 'A'
.
На первый взгляд это кажется отличной идеей. Одна кодировка, чтобы управлять ими всеми. Несколько языков в документе. Больше нет «переключения режимов» для переключения между кодировками в середине потока. Но сразу же у вас должен возникнуть очевидный вопрос.Четыре байта? Для каждого отдельного символа‽ Это кажется ужасно расточительным, особенно для таких языков, как английский и испанский, которым требуется менее одного байта (256 чисел) для выражения всех возможных символов. Фактически, это расточительно даже для языков, основанных на идеограммах (таких как китайский), которым никогда не требуется более двух байтов на символ.
Существует кодировка Unicode, которая использует четыре байта на символ. Он называется UTF-32, потому что 32 бита = 4 байта. UTF-32 - это простая кодировка; он принимает каждый символ Юникода (4-байтовое число) и представляет символ с тем же номером.Это дает некоторые преимущества, наиболее важным из которых является то, что вы можете найти N-й символ строки за постоянное время, потому что N-й символ начинается с байта 4 × N-го . У него также есть несколько недостатков, самый очевидный из которых состоит в том, что для хранения каждого чертового символа требуется четыре чертовых байта.
Несмотря на то, что существует много символов Unicode, оказывается, что большинство людей никогда не будут использовать ничего, кроме первого 65535. Таким образом, существует другая кодировка Unicode, называемая UTF-16 (потому что 16 бит = 2 байта).UTF-16 кодирует каждый символ от 0 до 65535 как два байта, а затем использует некоторые грязные приемы, если вам действительно нужно представить редко используемые символы Unicode «астрального плана» за пределами 65535. Наиболее очевидное преимущество: UTF-16 вдвое больше пробела - эффективен, как UTF-32, потому что для каждого символа требуется только два байта для хранения вместо четырех байтов (за исключением тех, которые этого не делают). И вы все равно можете легко найти N-й символ строки за постоянное время, если предположите, что строка не включает в себя никаких символов астрального плана, что является хорошим предположением вплоть до того момента, когда это не так.
Но есть и неочевидные недостатки UTF-32 и UTF-16. В разных компьютерных системах отдельные байты хранятся по-разному. Это означает, что символ U + 4E2D
может быть сохранен в UTF-16 как 4E 2D
или 2D 4E
, в зависимости от того, является ли система прямым или прямым порядком байтов. (Для UTF-32 существует еще больше возможных порядков байтов.) Пока ваши документы никогда не покидают ваш компьютер, вы в безопасности - разные приложения на одном компьютере будут использовать один и тот же порядок байтов.Но как только вы захотите передать документы между системами, возможно, в какой-то всемирной паутине, вам понадобится способ указать, в каком порядке хранятся ваши байты. В противном случае принимающая система не имеет возможности узнать, означает ли двухбайтовая последовательность 4E 2D
U + 4E2D
или U + 2D4E
.
Для решения этой проблемы многобайтовые кодировки Unicode определяют «Знак порядка байтов», который представляет собой специальный непечатаемый символ, который вы можете включить в начало документа, чтобы указать, в каком порядке находятся ваши байты.Для UTF-16 метка порядка байтов - U + FEFF
. Если вы получаете документ UTF-16, который начинается с байтов FF FE
, вы знаете, что порядок байтов односторонний; если он начинается с FE FF
, вы знаете, что порядок байтов обратный.
Тем не менее, UTF-16 не совсем идеален, особенно если вы имеете дело с большим количеством символов ASCII . Если задуматься, даже китайская веб-страница будет содержать много символов ASCII - все элементы и атрибуты, окружающие печатные китайские символы.Возможность найти символ N-й за постоянное время - это хорошо, но все еще существует проблема, связанная с этими персонажами астрального плана, что означает, что вы не можете гарантировать , что каждый символ составляет ровно два байта, поэтому вы не можете действительно находит N-й символ в постоянное время, если вы не поддерживаете отдельный индекс. И, боже, в мире действительно много текста ASCII …
Другие люди размышляли над этими вопросами, и они нашли решение:
UTF-8
UTF-8 - это система кодирования переменной длины для Unicode.То есть разные символы занимают разное количество байтов. Для ASCII символов (A-Z, и c.) UTF-8 использует только один байт на символ. Фактически, он использует одни и те же байты; первые 128 символов (0–127) в UTF-8 неотличимы от ASCII . «Расширенные латинские» символы, такие как ñ и ö, занимают два байта. (Байты - это не просто кодовая точка Unicode, как в UTF-16; здесь присутствует серьезное искажение битов.) Китайские символы, такие как 中, занимают три байта. Редко используемые символы «астрального плана» занимают четыре байта.
Недостатки: поскольку каждый символ может занимать разное количество байтов, поиск N-го символа является операцией O (N), то есть чем длиннее строка, тем больше времени требуется для поиска определенного символа. Кроме того, используется перестановка битов для кодирования символов в байты и декодирования байтов в символы.
Преимущества: сверхэффективное кодирование распространенных символов ASCII .Не хуже, чем UTF-16 для расширенных латинских символов. Лучше, чем UTF-32 для китайских иероглифов. Кроме того (и вам придется мне поверить в этом, потому что я не собираюсь показывать вам математику), из-за точной природы битового тидлинга нет проблем с порядком байтов. Документ с кодировкой UTF-8 использует один и тот же поток байтов на любом компьютере.
⁂
Дайвинг в
В Python 3 все строки представляют собой последовательности символов Юникода. Не существует такой вещи, как строка Python, закодированная в UTF-8 , или строка Python, закодированная как CP-1252.«Это строка UTF-8 ?» неверный вопрос. UTF-8 - это способ кодирования символов как последовательности байтов. Если вы хотите взять строку и превратить ее в последовательность байтов в определенной кодировке символов, Python 3 может вам в этом помочь. Если вы хотите взять последовательность байтов и превратить ее в строку, Python 3 тоже может вам в этом помочь. Байты не являются символами; байты байты. Персонажи - это абстракция. Строка - это последовательность этих абстракций.
>>> s = '深入 Python' ① >>> лин (-и) ② 9 >>> с [0] ③ '深' >>> с + '3' ④ '深入 Python 3'
- Чтобы создать строку, заключите ее в кавычки.Строки Python могут быть определены как в одинарных кавычках (
'
), так и в двойных кавычках ("
). - Встроенная функция
len ()
возвращает длину строки, , т.е. - количество символов. Это та же функция, которую вы используете для определения длины списка, кортежа, набора или словаря. Строка похожа на набор символов. - Точно так же, как получение отдельных элементов из списка, вы можете получить отдельные символы из строки, используя нотацию индекса.
- Как и в списках, вы можете объединить строки с помощью оператора
+
.
⁂
Строки форматирования
Строки могут быть определены как в одинарных, так и в двойных кавычках.
Давайте еще раз взглянем на humanize.py
:
[загрузить humanize.py
]
СУФФИКСОВ = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], ①
1024: [KiB, MiB, GiB, TiB, PiB, EiB, ZiB, YiB]}
def приблизительный_размер (размер, a_kilobyte_is_1024_bytes = True):
'' 'Преобразование размера файла в удобочитаемую форму.②
Аргументы ключевого слова:
size - размер файла в байтах
a_kilobyte_is_1024_bytes - если True (по умолчанию), использовать кратные 1024
если False, используйте число, кратное 1000.
Возвращает: строка
'' ③
если размер <0:
поднять ValueError ('число должно быть неотрицательным') ④
multiple = 1024, если a_kilobyte_is_1024_bytes иначе 1000
для суффикса в СУФФИКСАХ [несколько]:
size / = несколько
если размер <несколько:
вернуть '{0 :.1f} {1} '. Формат (размер, суффикс) ⑤
поднять ValueError ("слишком большое число")
-
'KB'
,'MB'
,'GB'
… это каждая строка. - Строки документации функции являются строками. Эта строка документации занимает несколько строк, поэтому в начале и в конце строки используются кавычки «три в ряд».
- Эти тройные кавычки завершают строку документации.
- Другая строка передается исключению в виде удобочитаемого сообщения об ошибке.
- Это… эй, что это за хрень?
Python 3 поддерживает форматирование значений в строки. Хотя это может включать в себя очень сложные выражения, в большинстве случаев используется вставка значения в строку с одним заполнителем.
>>> username = 'mark' >>> пароль = 'PapayaWhip' ① >>> "Пароль {0}: {1}". Формат (имя пользователя, пароль) ② "пароль знака - PapayaWhip"
- Нет, мой пароль на самом деле не PapayaWhip .
- Здесь много чего происходит. Во-первых, это вызов метода строкового литерала. Строки - это объекты , а у объектов есть методы. Во-вторых, все выражение оценивается как строка. В-третьих,
{0}
и{1}
- это поля замены , которые заменяются аргументами, переданными методу () формата.
Имена составных полей
В предыдущем примере показан простейший случай, когда поля замены представляют собой просто целые числа.Поля целочисленной замены обрабатываются как позиционные индексы в списке аргументов метода format ()
. Это означает, что {0}
заменяется первым аргументом (в данном случае имя пользователя ), {1}
заменяется вторым аргументом ( пароль ), и c. Вы можете иметь столько позиционных индексов, сколько аргументов, и сколько хотите аргументов. Но поля замещения намного мощнее этого.
>>> импорт человеческий >>> si_suffixes = humanize.СУФФИКСЫ [1000] ① >>> si_suffixes [KB, MB, GB, TB, PB, EB, ZB, YB] >>> '1000 {0 [0]} = 1 {0 [1]}'. Format (si_suffixes) ② '1000 КБ = 1 МБ'
- Вместо того, чтобы вызывать какую-либо функцию в модуле
humanize
, вы просто берете одну из структур данных, которые он определяет: список суффиксов SI (степени 1000). - Это выглядит сложно, но это не так.
{0}
будет относиться к первому аргументу, переданному методуformat ()
, si_suffixes . Но si_suffixes - это список. Итак,{0 [0]}
относится к первому элементу списка, который является первым аргументом, переданным методуformat ()
:'KB'
. Между тем,{0 [1]}
относится ко второму элементу того же списка:'MB'
. Все, что находится за фигурными скобками, включая1000
, знак равенства и пробелы, остается нетронутым.Конечный результат - строка'1000KB = 1MB'
.
{0} заменяется аргументом 1 st format (). {1} заменен на 2 .
Этот пример показывает, что спецификаторы формата могут обращаться к элементам и свойствам структур данных, используя (почти) синтаксис Python . Это называется составных полей с именами . Следующие составные имена полей «просто работают»:
- Передача списка и доступ к элементу списка по индексу (как в предыдущем примере)
- Передача словаря и доступ к значению словаря с помощью ключа
- Передача модуля и доступ к его переменным и функциям по имени
- Передача экземпляра класса и доступ к его свойствам и методам по имени
- Любая комбинация вышеперечисленного
Просто поразительно, вот пример, который объединяет все вышеперечисленное:
>>> импорт человеческий >>> импортная система >>> '1 МБ = 1000 {0.modules [humanize] .SUFFIXES [1000] [0]} '. format (sys) '1 МБ = 1000 КБ'
Вот как это работает:
- Модуль
sys
содержит информацию о текущем запущенном экземпляре Python. Поскольку вы только что импортировали его, вы можете передать сам модульsys
в качестве аргумента методуformat ()
. Таким образом, поле замены{0}
относится к модулюsys
. -
sys.modules
- это словарь всех модулей, импортированных в этот экземпляр Python.Ключи - это имена модулей в виде строк; значения - это сами объекты модуля. Таким образом, поле замены{0.modules}
относится к словарю импортированных модулей. -
sys.modules ['humanize']
- это модульhumanize
, который вы только что импортировали. Поле замены{0.modules [humanize]}
относится к модулюhumanize
. Обратите внимание на небольшую разницу в синтаксисе здесь. В реальном коде Python ключиsys.модули словаря
являются строками; чтобы ссылаться на них, вам нужно заключить имя модуля в кавычки (, например,'humanize'
). Но в поле замены вы пропускаете кавычки вокруг имени ключа словаря (, например,человеческий размер
). Процитируем PEP 3101: Advanced String Formatting: «Правила синтаксического анализа ключа элемента очень просты. Если оно начинается с цифры, то оно рассматривается как число, в противном случае используется как строка ». -
систем.modules ['humanize']. SUFFIXES
- это словарь, определенный в верхней части модуляhumanize
. Поле замены{0.modules [humanize] .SUFFIXES}
относится к этому словарю. -
sys.modules ['humanize']. SUFFIXES [1000]
- это список суффиксов SI :['KB', 'MB', 'GB', 'TB', 'PB', 'EB' , «ZB», «YB»]
. Таким образом, поле замены{0.modules [humanize] .SUFFIXES [1000]}
относится к этому списку. -
систем.modules ['humanize']. SUFFIXES [1000] [0]
- это первый элемент в списке суффиксов SI :'KB'
. Таким образом, поле полной замены{0.modules [humanize] .SUFFIXES [1000] [0]}
заменяется двухсимвольной строкойKB
.
Спецификаторы формата
Но подождите! Есть больше! Давайте еще раз посмотрим на эту странную строку кода из humanize.py
:
, если размер <кратный:
вернуть '{0 :.1f} {1} '. Формат (размер, суффикс)
{1}
заменяется вторым аргументом, переданным методу format ()
, который представляет собой суффикс . Но что такое {0: .1f}
? Это две вещи: {0}
, которую вы узнаете, и : .1f
, которую вы не знаете. Вторая половина (включая двоеточие и после него) определяет спецификатор формата , который дополнительно уточняет, как должна быть отформатирована заменяемая переменная.
☞Спецификаторы формата позволяют изменять замещающий текст различными полезными способами, например, с помощью функции
printf ()
в C.Вы можете добавлять заполнение нулями или пробелами, выравнивать строки, управлять десятичной точностью и даже преобразовывать числа в шестнадцатеричные.
В поле замены двоеточие (:
) отмечает начало спецификатора формата. Спецификатор формата « .1
» означает «округление до ближайшей десятой» (, т.е. отображает только одну цифру после десятичной точки). Спецификатор формата « f
» означает «число с фиксированной точкой» (в отличие от экспоненциальной записи или другого десятичного представления).Таким образом, учитывая размер 698,24
и суффикс 'GB'
, форматированная строка будет '698,2 ГБ'
, потому что 698,24
округляется до одного десятичного знака, затем добавляется суффикс после номера.
>>> '{0: .1f} {1}'. Format (698.24, 'GB') '698,2 ГБ'
Чтобы получить все подробные сведения о спецификаторах формата, обратитесь к мини-языку спецификации формата в официальной документации Python.
⁂
Другие распространенные строковые методы
Помимо форматирования, строки могут выполнять ряд других полезных приемов.
>>> s = '' 'Готовые файлы пере- ① ... результат научных исследований- ... ic исследование в сочетании с ... стаж лет. '' >>> s.splitlines () ② ['Готовые файлы пере-', 'культ лет науки', 'ic study в сочетании с', 'многолетний опыт.'] >>> печать (т. Ниже ()) ③ готовых файлов пере- результат лет научных- исследование ic в сочетании с многолетний опыт. >>> s.lower (). Count ('f') ④ 6
- В интерактивной оболочке Python можно ввести многострочных строк. Как только вы начнете многострочную строку с тройных кавычек, просто нажмите ENTER , и интерактивная оболочка предложит вам продолжить строку.Ввод закрывающих тройных кавычек завершает строку, и следующий ENTER выполнит команду (в данном случае присвоение строке s ).
- Метод
splitlines ()
принимает одну многострочную строку и возвращает список строк, по одной для каждой строки оригинала. Обратите внимание, что символы возврата каретки в конце каждой строки не включаются. - Метод
lower ()
преобразует всю строку в нижний регистр.(Аналогично, методupper ()
преобразует строку в верхний регистр.) - Метод
count ()
подсчитывает количество вхождений подстроки. Да, в этом предложении действительно шесть «е»!
Вот еще один частый случай. Допустим, у вас есть список пар ключ-значение в форме ключ1 = значение1 и ключ2 = значение2
, и вы хотите разделить их и составить словарь формы {ключ1: значение1, ключ2: значение2}
.
>>> query = 'user = pilgrim & database = master & password = PapayaWhip' >>> a_list = query.split ('&') ① >>> a_list ['пользователь = паломник', 'база данных = мастер', 'пароль = PapayaWhip'] >>> a_list_of_lists = [v.split ('=', 1) for v in a_list if '=' in v] ② >>> a_list_of_lists [['пользователь', 'паломник'], ['база данных', 'мастер'], ['пароль', 'PapayaWhip']] >>> a_dict = dict (a_list_of_lists) ③ >>> a_dict {'пароль': 'PapayaWhip', 'пользователь': 'паломник', 'база данных': 'мастер'}
- Строковый метод
split ()
имеет один обязательный аргумент - разделитель.Метод разбивает строку на список строк на основе разделителя. Здесь разделитель - это символ амперсанда, но это может быть что угодно. - Теперь у нас есть список строк, каждая из которых имеет ключ, за которым следует знак равенства, за которым следует значение. Мы можем использовать понимание списка для перебора всего списка и разделения каждой строки на две строки на основе первого знака равенства. Необязательный второй аргумент метода
split ()
- это количество раз, которое вы хотите разделить.1
означает «разделить только один раз», поэтому методsplit ()
вернет список из двух элементов. (Теоретически значение может также содержать знак равенства. Если бы вы просто использовали'key = value = foo'.split (' = ')
, вы бы получили список из трех пунктов[' key ', 'значение', 'foo']
.) - Наконец, Python может превратить этот список-списков в словарь, просто передав его в функцию
dict ()
.
☞Предыдущий пример очень похож на парсинг параметров запроса в URL-адресе , но реальный парсинг URL-адреса на самом деле более сложен, чем этот.Если вы имеете дело с параметрами запроса URL , лучше использовать функцию
urllib.parse.parse_qs ()
, которая обрабатывает некоторые неочевидные крайние случаи.
Нарезка струны
После того, как вы определили строку, вы можете получить любую ее часть как новую строку. Это называется нарезкой строки. Нарезка строк работает точно так же, как нарезка списков, что имеет смысл, потому что строки - это просто последовательности символов.
>>> a_string = 'Мой алфавит начинается там, где заканчивается ваш алфавит.' >>> a_string [3:11] ① 'алфавит' >>> a_string [3: -3] ② 'алфавит начинается там, где ваш алфавит' >>> a_string [0: 2] ③ Мой >>> a_string [: 18] ④ «Моя алфавит начинается» >>> a_string [18:] ⑤ "там, где заканчивается ваш алфавит".
- Вы можете получить часть строки, называемую «срезом», указав два индекса.Возвращаемое значение - новая строка, содержащая все символы строки по порядку, начиная с индекса первого фрагмента.
- Подобно спискам срезов, вы можете использовать отрицательные индексы для срезания строк.
- Строки начинаются с нуля, поэтому
a_string [0: 2]
возвращает первые два элемента строки, начиная сa_string [0]
, вплоть доa_string [2]
, но не включая его. - Если индекс левого сегмента равен 0, вы можете не указывать его, и подразумевается 0.Итак,
a_string [: 18]
совпадает сa_string [0:18]
, потому что подразумевается начальный 0. - Точно так же, если индекс правого фрагмента равен длине строки, вы можете не указывать его. Итак,
a_string [18:]
совпадает сa_string [18:44]
, потому что эта строка состоит из 44 символов. Здесь есть приятная симметрия. В этой 44-символьной строкеa_string [: 18]
возвращает первые 18 символов, аa_string [18:]
возвращает все, кроме первых 18 символов.Фактически,a_string [: n ]
всегда будет возвращать первые n символа, аa_string [ n :]
вернет остальные, независимо от длины строки.
⁂
Строки против байтов
Байты байты; персонажи - это абстракция. Неизменяемая последовательность символов Unicode называется строкой . Неизменяемая последовательность чисел от 0 до 255 называется объектом байта размером байта.
>>> by = b'abcd \ x65 ' ① >>> по b'abcde ' >>> тип (по) ② <класс 'байты'> >>> лён (по) ③ 5 >>> через + = b '\ xff' ④ >>> по b'abcde \ xff ' >>> лён (по) ⑤ 6 >>> через [0] ⑥ 97 >>> на [0] = 102 ⑦ Traceback (последний вызов последний): Файл "", строка 1, в TypeError: объект 'bytes' не поддерживает назначение элемента
- Для определения объекта размером
байт используйте синтаксис
b ''
« byte literal».Каждый байт в байтовом литерале может быть символом ASCII или закодированным шестнадцатеричным числом от\ x00
до\ xff
(0–255). - Тип объекта
байт
-байт
. - Так же, как списки и строки, вы можете получить длину объекта байтов
байт с помощью встроенной функции
len ()
. - Так же, как списки и строки, вы можете использовать оператор
+
для объединениябайтов и
объектов.Результатом является новый объект байт размеромбайт.
- Объединение 5-байтового объекта
байтов
и 1-байтового объектабайтов
дает вам 6-байтовый объектбайтов
. - Так же, как списки и строки, вы можете использовать нотацию индекса для получения отдельных байтов в объекте
байт и
. Элементы строки - это строки; элементы объекта байтовявляются целыми числами. В частности, целые числа от 0 до 255.
- Объект
байтов
является неизменным; нельзя назначать отдельные байты.Если вам нужно изменить отдельные байты, вы можете использовать операторы нарезки и конкатенации строк (которые работают так же, как строки), или вы можете преобразовать объектбайтов
в объектбайтового массива
.
>>> через = b'abcd \ x65 ' >>> barr = bytearray (by) ① >>> барр массив байтов (b'abcde ') >>> лин (барр) ② 5 >>> бар [0] = 102 ③ >>> барр массив байтов (b'fbcde ')
- Чтобы преобразовать объект
байтов
в изменяемый объектbytearray
, используйте встроенную функциюbytearray ()
. - Все методы и операции, которые вы можете выполнять с объектом
байтов
, вы можете выполнять и с объектомbytearray
. - Единственное отличие состоит в том, что с объектом
bytearray
вы можете назначать отдельные байты, используя индексную нотацию. Присвоенное значение должно быть целым числом от 0 до 255.
Единственное, чего вы, , никогда не сможете сделать - это смешивать байты и строки.
>>> by = b'd ' >>> s = 'abcde' >>> по + s ① Traceback (последний вызов последний): Файл "", строка 1, в >>> с.рассчитывать (по) ② Traceback (последний вызов последний): Файл "TypeError: невозможно объединить байты в строку ", строка 1, в >>> s.count (by.decode ('ascii')) ③ 1TypeError: невозможно неявно преобразовать объект 'bytes' в str
- Объединять байты и строки нельзя. Это два разных типа данных.
- Вы не можете подсчитать количество байтов в строке, потому что в строке нет байтов. Строка - это последовательность символов.Возможно, вы имели в виду «подсчитать количество вхождений строки, которые вы получите после декодирования этой последовательности байтов в определенной кодировке символов»? Что ж, вам нужно сказать это прямо. Python 3 не будет неявно преобразовывать байты в строки или строки в байты.
- По удивительному совпадению, эта строка кода гласит: «Подсчитайте количество вхождений строки, которую вы получите после декодирования этой последовательности байтов в данной кодировке символов».
И вот связь между строками и байтами: байтов Объекты
имеют метод decode ()
, который принимает кодировку символов и возвращает строку, а строки имеют метод encode ()
, который принимает кодировка символов и возвращает объект байтов
.В предыдущем примере декодирование было относительно простым - последовательность байтов в кодировке ASCII преобразовывалась в строку символов. Но тот же процесс работает с любой кодировкой, которая поддерживает символы строки, даже с устаревшими (не-Unicode) кодировками.
>>> a_string = '深入 Python' ① >>> длина (a_string) 9 >>> by = a_string.encode ('utf-8') ② >>> по b '\ xe6 \ xb7 \ xb1 \ xe5 \ x85 \ xa5 Python' >>> лён (по) 13 >>> by = a_string.кодировать ('gb18030') ③ >>> по b '\ xc9 \ xee \ xc8 \ xeb Python' >>> лён (по) 11 >>> by = a_string.encode ('big5') ④ >>> по b '\ xb2` \ xa4J Python' >>> лён (по) 11 >>> туда и обратно = by.decode ('big5') ⑤ >>> туда и обратно '深入 Python' >>> a_string == туда и обратно Истинно
- Это строка.В нем девять персонажей.
- Это объект размером
байт и
байтов. Имеет 13 байт. Это последовательность байтов, которую вы получите, если возьмете a_string и закодируете ее в UTF-8 . - Это объект размером
байт и
байтов. В нем 11 байтов. Это последовательность байтов, которую вы получите, если возьмете a_string и закодируете ее в GB18030. - Это объект размером
байт и
байтов. В нем 11 байтов. Это совершенно другая последовательность байтов , которую вы получите, когда возьмете a_string и закодируете ее в Big5. - Это строка. В нем девять персонажей. Это последовательность символов, которую вы получаете, когда вы берете на и декодируете ее с помощью алгоритма кодирования Big5. Он идентичен исходной строке.
⁂
Постскриптум: кодировка символов исходного кода Python
Python 3 предполагает, что ваш исходный код - , т.е. для каждого файла .py
- закодирован в UTF-8 .
☞В Python 2 кодировка по умолчанию для
.py
файлы были ASCII . В Python 3 кодировка по умолчанию - UTF-8 .
Если вы хотите использовать другую кодировку в своем коде Python, вы можете поместить объявление кодировки в первую строку каждого файла. Это объявление определяет файл .py
как windows-1252:
.
# - * - кодировка: windows-1252 - * -
Технически переопределение кодировки символов также может быть во второй строке, если первая строка представляет собой команду hash-bang, подобную UNIX .
#! / Usr / bin / python3
# - * - кодировка: windows-1252 - * -
Для получения дополнительной информации см. PEP 263: Определение кодировок исходного кода Python.
⁂
Дополнительная литература
В Unicode в Python:
- Python Unicode HOWTO
- Что нового в Python 3: текст против данных вместо Unicode против 8-битного
- PEP 261 объясняет, как Python обрабатывает астральные символы за пределами Базового Многоязычного Плана ( i.е. символа, порядковый номер которого больше 65535)
В Unicode в целом:
- Абсолютный минимум Каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (без оправданий!)
- О доброте Unicode
- В строках символов
- символов против байтов
О кодировке символов в других форматах:
- Кодировка символов в XML
- Кодировка символов в HTML
О строках и форматировании строк:
-
строка
- Общие строковые операции - Синтаксис строки формата
- Спецификация формата Мини-язык
- PEP 3101: расширенное форматирование строки
☜ ☞
© 2001–11 Марк Пилигрим
Как преобразовать целые числа в строки в Python 3
Как преобразовать целые числа в строки в Python 3
Часто вам нужно преобразовывать целые числа в строки в программировании на Python, особенно если вы хотите объединить целые числа со строками.В этом руководстве мы узнаем, как преобразовать python int в строку в python 3.
В python 3 функция str ()
, используемая для преобразования целых чисел в строки.
ул. (Внут.)
Пример:
х = 10
x = ул (10)
В приведенном выше примере функция str ()
преобразует переменную x в строку. Мы можем проверить это с помощью функции type ()
.
х = 10
печать (введите (x))
x = str (10)
print (введите (x))
Это выведет:
<класс 'int'>
<класс 'str'>
Объединение чисел и строк в Python 3
Например, язык программирования Python не позволяет объединять числа со строками.
возраст = 10
print («Возраст» + возраст)
Приведенный выше код приведет к следующей ошибке:
TypeError: не удается неявно преобразовать объект int в str
Итак, нам нужно преобразовать возраст переменной int в строку с помощью функции Python str ()
, как показано в приведенном ниже примере.
возраст = 10
print ("Возраст" + str (возраст))
Это выведет:
Возраст 10
Python 3 Форматирование строк
Если вы хотите добавить числа в строку без преобразования, вам нужно использовать метод python 3 format ()
.
число1 = 10
число2 = 20
print ("число1 равно {}, а число2 равно {}" .format (число1, число2))
В приведенном выше примере функция format ()
заменит фигурные скобки внутри строки («{}») на num1 и num2 соответственно. Код будет выводиться.
число1 равно 10 и число2 равно 20
Python 3 str ()
Функция также может использоваться для преобразования других типов данных в строки, включая числа с плавающей запятой, список и словари.
.