Хелпикс

Главная

Контакты

Случайная статья





Дата: 01.06.2020 (2 часа). ССА Основы алгоритмизации и программирования. Лекция №15. Строки



Дата: 01.06.2020 (2 часа)

19-11-1 ССА Основы алгоритмизации и программирования

Лекция №15

Строки

 

Строка – это список символов. В Python в строках применяются символы из таблицы символов кодировки Юникод (Unicode).

Строка может быть оформлена различным способом.

Как правило, строки заключают в одинарные (') или двойные (") кавычки:

str1 = 'Строка 1'

str2 = "Строка 2"

Также строка может быть заключена в тройные одинарные или тройные двойные кавычки:

str3 = ' ' 'Строка 3' ' '

str4 = " " "Строка 4" " "

При оформлении строк следует соблюдать правило: последовательность кавычек, с которой было начато оформление строки, также должна завершать данную строку.

 

 

Для создания строки также можно воспользоваться функцией str( ), которая формирует строку на основе объекта, переданного в качестве параметра:

str1 = str(8)                                      # '8'

str2 = str(3.14)                     # '3.14'

str3 = str([ "First", "Second", "Third" ])     # "[ 'First', 'Second', 'Third' ]"

str4 = str({ -7, 'Element', 3.14 }) # "{ -7, 'Element', 3.14 }"

 

Строка также может быть создана пустой:

str0 = str( )                                       # ' '

str0 = ' '                                # ' '

str0 = " "                               # ' '

str0 = ' ' ' ' ' '                         # ' '

str0 = " " " " " "                     # ' '

 

 

Для оформления строк предусмотрено использование специальных символов. Например, одинарные и двойные кавычки выступают в роли символов, обозначающих границы строк. Удобно для обозначения границ строки использовать один вид кавычек, а для внедрения в строку кавычек как символов – другой их вид:

str1 = 'Символ \' удобно чередовать с символом " в строке.'

# 'Символ \' удобно чередовать с символом " в строке.'

str2 = "Символ ' удобно чередовать с символом \" в строке."

# 'Символ \' удобно чередовать с символом " в строке.'

str3 = ' ' 'Символ ' удобно чередовать с символом " в строке.' ' '

# 'Символ \' удобно чередовать с символом " в строке.'

str4 = " " "Символ ' удобно чередовать с символом " в строке." " "

# 'Символ \' удобно чередовать с символом " в строке.'

 

 

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

str5 = 'Это символ кавычки: \'. Это символ обратного слэша: \'

# Ошибка (связка \' есть символ ', а не символ конца строки)

str5 = 'Это символ кавычки: \'. Это символ обратного слэша: \\'

# "Это символ кавычки: '. Это символ обратного слэша: \\"

 

 

В случаях, когда создаваемая строка содержит большое количество символов обратного слэша, удобно не переводить в символ (экранировать) каждое его вхождение в строку, а задать для всей строки перевод входящих в неё обратных слэшей в символы, указав литеру r перед началом строки:

str6 = r'Это символ кавычки: \'. Это символ обратного слэша: \'

# Ошибка (между \ и ' должен быть хотя бы один символ)

str6 = r'Это символ кавычки: \'. Это символ обратного слэша: \\'

# "Это символ кавычки: \\'. Это символ обратного слэша: \\\\"

 

 

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

 

Запись Печатаемый символ
\\ Обратный слеш: \
\' Апостроф: '
\" Двойная кавычка: "
\b Забой: нажатие клавиши Backspace
\r Возврат каретки: нажатие клавиши Home
\t Табуляция: нажатие клавиши Tab
\n Перевод строки: нажатие клавиши Enter
\[Enter] Игнорирование разбиения строки на две части
\N{Имя символа} Символ Unicode с заданным именем (\N{Space})
\### Символ Unicode с восьмеричным кодом ### (\047)
\x## Символ Unicode с шестнадцатеричным кодом ## (\xF0)
\u#### Символ Unicode с шестнадцатеричным кодом #### (\u09AF)
\U######## Символ Unicode с шестнадцатеричным кодом ######## (\U000020AC)

 

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

str7 = ('Строка 1. ' +

'Строка 2. ' +

'Строка 3.')           # 'Строка 1. Строка 2. Строка 3.'

 

str7 = ('Строка 1. ' +

'Строка 2. ' +

'Строка 3.')           # Ошибка (отсутствуют круглые скобки)

 

str7 = 'Строка 1. ' + 'Строка 2. ' + 'Строка 3.')

# 'Строка 1. Строка 2. Строка 3.'

Строки можно сравнивать друг с другом при помощи операций сравнения <, <=, ==, !=, >=, >. Следует отметить, что сравнение строк осуществляется по байтам, а не по символам. Это приводит к тому, что один и тот же символ, записанный в разных кодировках (например, в Unicode и UTF-8) будет представлен различными байтами и их количеством. Как следствие, строки, одинаковые с точки зрения человека, будут восприниматься программой как различные. Чтобы решить данную проблему, можно подключить модуль unicodedata и воспользоваться его функцией normalize, которой в качестве первого параметра следует передать строку "NFKD" (Normalization Form Compatibility Decomposition – разложение в стандартизированном виде совместимости), а в качестве второго – сравниваемую строку. Как результат своей работы данная функция вернёт переданную ей строку, приведённую к кодировке UTF-8.

import unicodedata

unicodedata.normalize('NFKD', '\u23B7' + '\N{euro sign}')     # '⎷?'

 

Примеры работы операций сравнения строк:

'abc' == 'abc'                    # True

'abc' != 'abC'                    # True

'abc' < 'abc'                                  # False

'abc' < 'abC'                     # False

'abc' <= 'abc'                    # True

'abc' <= 'abC'                              # False

'abc' > 'abc'                                  # False

'abc' > 'abC'                     # True

'abc' >= 'abc'                    # True

'abc' >= 'abC'                              # True

 

Как было показано в приведённых примерах, на результат сравнения оказывают влияние коды символов, переводимые в байтовое представление, которое затем используется в операциях сравнения. При этом код символа может определяться как выбранной для него кодировкой (например, буква 'Ъ' в таблице символов ASCII имеет код 218, а в таблице Unicode – 1066), так и его регистром ('ъ' и 'Ъ' различны). В связи с эти рекомендуется при сравнении строк, которые могут быть представлены в различных кодировках (например, если строки были считаны из разных текстовых файлов), предварительно переводить их символы в кодировку UTF-8 при помощи функции normalize модуля unicodedata с последующим приведением их к единому регистру (верхнему или нижнему):

import unicodedata

str = '\u0430' + '\u0431' + '\u0412'                             # 'абВ'

unicodedata.normalize('NFKD', str).upper()                  # 'АБВ'

    

 

Метод строки Описание работы метода
s.find(t, start, end) Возвращает позицию первого слева вхождения подстроки t в строку s. Если подстрока не была обнаружена, метод возвращает -1. Если при вызове метода были указаны параметры start и end, то проверка производится для подстроки s[start, end] (позиция вхождения определяется относительно начала строки s).
s.rfind(t, start, end) Возвращает позицию первого справа вхождения подстроки t в строку s. При этом позиция вхождения отсчитывается от начала строки s. Если подстрока не была обнаружена, метод возвращает -1. Если при вызове метода были указаны параметры start и end, то проверка производится для подстроки s[start, end] (позиция вхождения определяется относительно начала строки s).
s.index(t, start, end) Возвращает позицию первого слева вхождения подстроки t в строку s. Если подстрока не была обнаружена, возникает исключение ValueError. Если при вызове метода были указаны параметры start и end, то проверка производится для подстроки s[start, end] (позиция вхождения определяется относительно начала строки s).
s.count(t, start, end) Возвращает число вхождений строки t в строку s или, если были указаны последние два параметра, в ее подстроку s[start, end].

 

 

Метод строки Описание работы метода
s.startswith(x, start, end) Возвращает True, если строка s начинается подстрокой x или, если x является кортежем, любой строкой из этого кортежа. В противном случае метод возвращает False. Если при вызове метода были указаны параметры start и end, то проверка производится для подстроки s[start, end].
s.endswith(x, start, end) Возвращает True, если строка s оканчивается подстрокой x или, если x является кортежем, любой строкой из этого кортежа. В противном случае метод возвращает False. Если при вызове метода были указаны параметры start и end, то проверка производится для подстроки s[start, end].
s.replace(t, u, n) Возвращает копию строки s, в которой каждое вхождение подстроки t заменено строкой u. Если при вызове метода было указано значение параметра n, то замена осуществляется по первым n вхождениям слева подстроки t в строку s.
s.expandtabs(size) Возвращает копию строки s, в которой каждый символ табуляции заменен последовательностью пробелов длиной size. Если параметр size не был указан, то длина последовательности пробелов устанавливается равной 8.

 


 

Метод строки Описание работы метода
s.ljust(width, char) Возвращает строку длиной width, в начале которой в качестве подстроки размещена копия строки s, а справа от нее – символы char. Если символ заполнения char не был указан, то вместо него используются пробелы.
s.center(width, char) Возвращает строку длиной width, в центре которой в качестве подстроки размещена копия строки s, а слева и справа от нее – символы char. Если символ заполнения char не был указан, то вместо него используются пробелы.
s.rjust(width, char) Возвращает строку длиной width, в конце которой в качестве подстроки размещена копия строки s, а слева от нее – символы char. Если символ заполнения char не был указан, то вместо него используются пробелы.
s.zfill(width) Возвращает строку длиной width, в конце которой в качестве подстроки размещена копия строки s, а слева от нее – символы '0'.
s.strip(chars) Возвращает копию строки s, в которой удалены пробельные символы с начала и с конца строки до первых непробельных символов. Если при вызове метода было указано значение параметра chars, то вместо пробельных символов удаляются все символы из строки chars.
s.lstrip(chars) Возвращает копию строки s, в которой удалены пробельные символы с начале строки до первого непробельного символа. Если при вызове метода было указано значение параметра chars, то вместо пробельных символов удаляются все символы из строки chars.
s.rstrip(chars) Возвращает копию строки s, в которой удалены пробельные символы с конца строки до первого непробельного символа. Если при вызове метода было указано значение параметра chars, то вместо пробельных символов удаляются все символы из строки chars.
Метод строки Описание работы метода
s.lower() Возвращает копию строки s, в которой все символы приведены к нижнему регистру.
s.upper() Возвращает копию строки s, в которой все символы приведены к верхнему регистру.
s.swapcase() Возвращает копию строки s, в которой все алфавитные символы, находившиеся в верхнем регистре, были записаны в нижнем регистре, а символы, находившиеся в нижнем регистре, были записаны в верхнем регистре.
s.capitalize() Возвращает копию строки s с записанным в верхнем регистре первым символом.
s.islower(x) Возвращает True, если строка s содержит алфавитные символы и все они находятся в нижнем регистре.
s.isupper(x) Возвращает True, если строка s содержит алфавитные символы и все они находятся в верхнем регистре.

 

Метод строки Описание работы метода
s.title (x) Возвращает копию строки s, в которой у каждого слова первый символ переведен в верхний регистр, а оставшиеся символы – в нижний.
s.istitle() Возвращает True, если строка s не пустая и имеет формат заголовка (у каждого слова первый символ находится в верхнем регистре, а оставшиеся символы – в нижнем).
s.format(…) Возвращает копию строки s, отформатированную в соответствии с заданными параметрами.
s.encode(encoding, err) Возвращает объект типа bytes, представляющий строку в кодировке encoding с обработкой ошибок, задаваемой параметром err. Если метод был вызван без параметров, то используется кодировка по умолчанию.
s.maketrans() Возвращает таблицу, в которой каждому символу строки s1 поставлен в соответствие символ строки s2.
s.translate(table) Возвращает строку, полученную путём преобразования символов строки s согласно таблице соответствия символов table.

 

Метод строки Описание работы метода
s.isalnum() Возвращает True, если строка s не пустая и содержит только алфавитные и цифровые символы.
s.isalpha() Возвращает True, если строка s не пустая и содержит только алфавитные символы.
s.isdecimal() Возвращает True, если строка s не пустая и содержит только символы кодировки Unicode, обозначающие цифры от 0 до 9.
s.isdigit() Возвращает True, если строка s не пустая и содержит только символы кодировки ASCII, обозначающие цифры от 0 до 9.
s.isidentifier() Возвращает True, если строка s не пустая и является допустимым идентификатором.
s.isnumeric() Возвращает True, если строка s не пустая и содержит только символы кодировки Unicode, используемые для обозначения чисел
s.isprintable() Возвращает True, если строка s пустая или содержит только печатаемые символы. К печатаемым символам относится пробел и не относится символ перевода строки.
s.isspace() Возвращает True, если строка s не пустая и содержит только пробельные символы.

 


 

 

Метод строки Описание работы метода
s.split(t, n) Возвращает список строк, являющихся подстроками строки s. Позиции разбиения строки s определяются по вхождениям подстроки t в строку s. Если при вызове метода было указано значение параметра n, то разбиение осуществляется по первым n вхождениям слева подстроки t в строку s. Если строка t не была задана, то строка s разбивается по пробельным символам.
s.rsplit(t, n) Возвращает список строк, являющихся подстроками строки s. Позиции разбиения строки s определяются по вхождениям подстроки t в строку s. Если при вызове метода было указано значение параметра n, то разбиение осуществляется по первым n вхождениям справа подстроки t в строку s. Если строка t не была задана, то строка s разбивается по пробельным символам.
s.splitlines(f) Возвращает список строк, являющихся подстроками строки s. Позиции разбиения строки s определяются по вхождениям символа перевода строки в строку s. Если при вызове метода было указано значение параметра f, равное False, то символы перевода строки не включаются в найденные фрагменты.

 


 

 

Метод строки Описание работы метода
s.partition(t) Возвращает кортеж, включающий в себя три строки. Первой строкой кортежа является подстрока от начала строки s до первого вхождения в нее слева строки t. Вторым элементом кортежа является строка t. Третьим элементом кортежа является оставшаяся часть строки s, начиная с позиции после первого вхождения строки t и заканчивая концом строки s. Если вхождение строки t в строку s не было найдено, метод возвращает кортеж, первым элементом которого является строка s, а оставшимися двумя элементами – пустые строки.
s.rpartition(t) Возвращает кортеж, включающий в себя три строки. Первой строкой кортежа является подстрока от начала строки s до первого вхождения в нее справа строки t. Вторым элементом кортежа является строка t. Третьим элементом кортежа является оставшаяся часть строки s, начиная с позиции после первого вхождения строки t и заканчивая концом строки s. Если вхождение строки t в строку s не было найдено, метод возвращает кортеж, первым элементом которого является строка s, а оставшимися двумя элементами – пустые строки.
s.join(seq) Объединяет все элементы последовательности seq, вставляя между ними строку s (допускается использовать пустую строку).

 

Как и в случае со списками, каждый символ в строке имеет порядковый номер (индекс), по которому можно получить его значение как элемента списка символов. Нумерация символов в строке начинается нуля :

       str1 = '123'                      # '123'

       str1 [ 0 ]                             # '1'

       str1 [ 1 ]                             # '2'

       str1 [ 2 ]                             # '3'

       str1 [ 3 ]                             # Ошибка (выход за пределы строки)

 

Узнать количество символов в строке (её длину) можно при помощи функции len(), в которую данная строка передаётся параметром:

       len(str)                   # 3

 

При работе со строками допускается использовать отрицательные индексы. В этом случае отсчёт производится с конца строки в обратном направлении:

       str1 [ -1 ]                           # '3'

       str1 [ -2 ]                           # '2'

       str1 [ -3 ]                           # '1'

       str1 [ -4 ]                           # Ошибка (выход за пределы строки)

 

Отрицательные индексы удобны при решении ряда задач. Например, всегда можно получить последний элемент строки, не определяя её длину, если обратиться к её элементу с индексом -1:

       str2 = '0123456789' # '0123456789'

       str2 [ -1 ]                           # '9'

 

Строки позволяют получать не только отдельные свои символы, но и их последовательности. Для этого используется оператор среза «:», по обе стороны которого индексами задаются левая и правая границы выводимой последовательности. Символ, индекс которого указан справа от оператора среза, не включается в результат.

       str2 [ 0:3 ]                          # '012'

 

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

       str2 [ : ]                              # '0123456789'

       str2 [ :3 ]                            # '012'

       str2 [ 3: ]                            # '3456789'

       str2 [ -3: ]                          # '789'

       str2 [ :-3 ]                          # '0123456'

 

Из строки может быть извлечена последовательность символов с заданным интервалом между их индексами. Для этого после основного оператора среза «:» используется дополнительный, после которого указывается величина интервала (шаг). Формируемая последовательность начинается с первого символа исходной строки. Каждый последующий символ определяется путём изменения индекса предыдущего символа на величину шага:

       str2 = 'палиндром'         # 'палиндром'

       str2 [ : :3 ]                          # 'пир'

 

Если задать отрицательное значение шага, то отбор символов из строки будет происходить от её конца к началу:

       str2 = 'скотовод'             # 'скотовод'

       str2 [ : :-3 ]                        # 'док'

 

Отрицательный индекс удобно использовать для вывода всех символов строки в обратном порядке:

       str2 = 'город рос'            # 'город рос'

       str2 [ : :-1 ]                        # 'сор дорог'

 

Строки позволяют проверять наличие в них заданной подстроки:

       str1                                                # '123'

       str2                                                # 'скотовод'

       '23' in str1                                   # True

       '23' in str2                                   # False

       'кот' in str1                                  # False

       'кот' in str2                                  # True

 

Также можно проверить отсутствие в строке заданной подстроки:

       not '23' in str1                            # False

       not '23' in str2                            # True

       not 'кот' in str1                          # True

       not 'кот' in str2                          # False

 

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

       str2 [ 0 ] = 'A'                  # Ошибка (нельзя изменить строку)

       str2 [ 0:3 ] = '210'            # Ошибка (нельзя изменить строку)

 

Однако можно создать новую строку и заменить ею значение, хранящееся в переменной:

       str2 = 'А123456789' # 'А123456789'

       str2 = '2103456789' # '2103456789'

 

 

Из нескольких строк может быть образована новая строка путём их склеивания (конкатенации):

       str3 = 'Это '                     # 'Это '

       str4 = 'строка'                             # 'строка'

       str3 = str3 + 'новая '                 # 'Это новая '

       str3 = str3 + str4                   # 'Это новая строка'

 

Строка, а также последовательность её символов (подстрока), могут быть продублированы заданное количество раз:

       str4 = 'выр ' * 3                        # 'выр выр выр '

       str4 = 'Вобла '                             # 'Вобла '

       str4 [ 2:6 ] * 3                             # 'бла бла бла '

       str4 * 0                                        # ' '

 

При помощи оператора += на основе строки может быть создана её копия с добавленными в конец новыми символами, которая заменит текущее значение:

       str3 = 'АБВ'         # 'АБВ'

       str3 += '!!!‘                      # str3 = str3 + '!!!'

       str3                                    # 'АБВ!!!'

 

Оператор *= позволяет создать заданное количество копий строки и записать результат их конкатенации в переменную этой строки:

       str4 = 'ми '                       # 'ми '

       str4 *= 3                          # str4 = str4 + str4 + str4

       str4                                    # 'ми ми ми '

 

Пример работы метода join. помощи оператора += на основе строки может быть создана её копия с добавленными в конец новыми символами, которая заменит текущее значение:

       list1 = [ "C:", "Windows", "System32" ]

       # [ 'C:', 'Windows', 'System32' ]

       str5 = ' '.join(list1)           # 'C: Windows System32'

       str5 = '\'.join(list1)           # 'C:\Windows\System32'

       str5 = ''.join(list1)            # 'C:WindowsSystem32'

 

 

При помощи метода format можно создавать строки, используя строки-шаблоны. Метод format вызывается для строки-шаблона и принимает в качестве параметров значения или хранящие их переменные, которыми будут заменены поля строки-шаблона.

       str0 = "Роман '{0}' был опубликован в {1} году."

       # "Роман '{0}' был опубликован в {1} году."

       str6 = str0.format("1984", 1949)

       # "Роман '1984' был опубликован в 1949 году."

 

Дублирование фигурной скобки приводит к образованию соответствующего ей символа строки:

       "Роман '{{{0}}}' был опубликован в {{1}} году.".format("1984", 1949)

       # "Роман '{1984}' был опубликован в {1} году."

 

Возможности форматирования позволяют создавать строки по частям:

       list1 = [ 1, 2, 3 ]                        # [ 1, 2, 3 ]

       set1 = { 3, 4, 5 }                       # { 3, 4, 5 }

       num1 = 3                                     # 3

       "В {0} и {1} общий элемент: {2}.".format(list1, sеt1, num1)

       # "В [1, 2, 3] и {3, 4, 5} общий элемент: 3."

 

При этом между частями строки могут быть добавлены разделители:

       str7 = "C:"                                   # 'C:'

       str8 = "Windows"                       #  'Windows'

       str9 = "System32"                       # 'System32'

        "{0}\{1}\{2}".format(str7, str8, str9)   # 'C:\Windows\System32'

           

 

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.