Срез, он же слайс (от англ. slice, slicing) — инструмент извлечения подстроки (последовательности символов, англ. substring) из имеющейся строки. В квадратных скобках сразу после литерала конца строки указывается диапазон извлечения среза либо одиночный индекс, начиная с 0:
>>> len(‘Привет, мир!’) 12 >>> ‘Привет, мир!'[0:6] ‘Привет’ >>> ‘Привет, мир!'[0] ‘П’ >>> ‘Привет, мир!'[6] ‘,’ >>> ‘Привет, мир!'[8:11] ‘мир’
Правая граница, как и в случае с range() не входит в диапазон.
Примечание. Обратите внимание на то, что любой отсчёт в индексах начинается с 0 и правая граница извлечения не входит в диапазон, то есть слайс [8:11] по факту извлекает срез с 9 по 11 символы, а по индексам — с 8 по 10.
>>> ‘Привет, мир!'[11:12] ‘!’
Выход за диапазон доступных символов ошибку не вызовет, лишь вернёт пустую строку, даже в случае, когда первая граница диапазона больше второй границы:
>>> ‘Привет, мир!'[12:20] » >>> ‘Hello, world!'[20:6] »
Поэтому так важно контролировать правильность заданного диапазона индексов: пустая строка (как результат неправильного среза) уйдёт на дальнейшее выполнение и повлияет на выполнение кода. Обращение по индексу, выходящему за границу, работает строже:
7.4 Количество членов. «Поколение Python»: курс для начинающих. Курс Stepik
>>> ‘Hello, world!'[20] Traceback (most recent call last): . IndexError: string index out of range
Если диапазон начинается с нуля или идёт до конца, явное указание числа не обязательно:
>>> ‘Привет, мир!'[:6] ‘Привет’ >>> ‘Привет, мир!'[8:] ‘мир!’
Срез [:] создаст полную копию строки:
>>> ‘Привет, мир!'[:] ‘Привет, мир!’
Помимо этого, доступен шаг извлечения среза, шаг задаётся через второе двоеточие:
>>> ‘Привет, мир!'[::2] ‘Пие,мр’ >>> ‘Привет, мир!'[1::2] ‘рвт и!’ >>> ‘123456789’[::2] ‘13579’ >>> ‘123456789’[1::2] ‘2468’ >>> ‘123456789’[2::3] ‘369’
Реверс строки (чтение справа налево) возможен, если задать отрицательный шаг:
>>> ‘Привет, мир!'[::-1] ‘!рим ,тевирП’
Ну и в целом отрицательные диапазоны поддерживаются:
>>> ‘Привет, мир!'[-12:-6] ‘Привет’ >>> ‘Привет, мир!'[:-1] ‘Привет, мир’ >>> ‘Привет, мир!'[-6:-12:-1] ‘,тевир’
В связи с тем, что строка — это неизменяемая последовательность символов, для внесения изменений в неё нужно каждый раз пересобирать строку. При работе с большими массивами эта операция довольно затратна для памяти.
Если такого функционала недостаточно, на помощь приходят методы строки.
Методы
find(), rfind()
Метод find() находит подстроку в строке и вернёт индекс первого вхождения или -1, если подстрока не будет найдена:
>>> ‘Hello, world’.find(‘o’) 4 >>> ‘Hello, world’.find(‘Goodbye’) -1
Метод rfind() делает то же самое, но с другого конца строки:
>>> ‘Hello, world’.rfind(‘l’) 10
Обоим методам можно через запятую указать диапазон поиска, диапазон задаётся аналогично срезам, разве что нельзя игнорировать стартовый индекс:
7.4 До КОНЦА 1. «Поколение Python»: курс для начинающих. Курс Stepik
>>> ‘Hello, world’.find(‘o’, 5) 8 >>> ‘Hello, world’.find(‘l’, 0, -3) 2 >>> ‘Hello, world’.find(‘l’, , 10) SyntaxError: invalid syntax
index(), rindex()
Методы index() и rindex() аналогичны find() и rfind(), за исключением поведения, когда искомая подстрока не найдена — index() вернёт ошибку значения ValueError:
>>> ‘Hello, world’.index(‘o’) 4 >>> ‘Hello, world’.rindex(‘o’) 8 >>> ‘Hello, world’.index(‘a’) Traceback (most recent call last): . ValueError: substring not found
Методы index() и rindex() используются в тех случаях, когда отсутствие подстроки нельзя замалчивать во избежание дальнейших ошибок.
count()
Метод count() производит подсчёт количества вхождений подстроки в строку, в качестве необязательных аргументов поддерживает диапазон индексов:
>>> ‘Hello, world’.count(‘o’) 2 >>> ‘Hello, world’.count(‘o’, 10) 0
replace()
Для простой замены подстроки по шаблону существует метод replace(), в который первым аргументом нужно передать то, что будем менять, а вторым — на что. Опционально, третьим аргументом, можно указать количество необходимых замен:
>>> ‘Hello, world’.replace(‘l’, ‘L’) ‘HeLLo, worLd’ >>> ‘Hello, world’.replace(‘l’, ‘L’, 1) ‘HeLlo, world’ >>> ‘Hello, world’.replace(‘l’, ») ‘Heo, word’
expandtabs()
При импорте файла .txt случается, что файл отформатирован с применением табуляции и при его импорте приходится производить дополнительную обработку. Для облегчения этой задачи существует метод expandtabs(), который заменит экранированную последовательность ‘t’ на необходимое количество пробелов (по умолчанию — 8):
>>> print(‘Сложноtформатированнаяttстрока’) Сложно форматированная строка >>> print(‘Сложноtформатированнаяttстрока’.expandtabs(1)) Сложно форматированная строка >>> print(‘Сложноtформатированнаяttстрока’.expandtabs()) Сложно форматированная строка
Отсчёт символов при табуляции, как обычно, ведётся с начала строки:
>>> ‘Hello,tworld’.expandtabs() ‘Hello, world’ >>> ‘Hello,tworld’.expandtabs(10) ‘Hello, world’ >>> ‘Hello,tworld’.expandtabs(20) ‘Hello, world’ 12345678901234567890123456789 | |
split(), rsplit()
Также бывают ситуации, когда из строки нужно выделить в отдельный список определённые подстроки. Например, разбить строку на слова. По умолчанию, split() разбивает строку по пробельным символам (‘ ‘, ‘n’, ‘t’):
>>> ‘Эта строкаnразобьётся на списокtиз восьми элементов’.split() [‘Эта’, ‘строка’, ‘разобьётся’, ‘на’, ‘список’, ‘из’, ‘восьми’, ‘элементов’]
А если в аргументы передать ‘.’, то строку можно разбить на предложения, ‘n’ — на строки, ‘ ‘ — только по пробелам, и так далее.
>>> ‘Многоточие. приведёт к появлению пустых строк’.split(‘.’) [‘Многоточие’, », », ‘ приведёт к появлению пустых строк’]
Как и в случае с методами выше, вторым аргументом можно передать количество таких операций и есть брат-близнец rsplit():
>>> ‘www.python.design.blog’.split(‘.’, 1) [‘www’, ‘python.design.blog’] >>> ‘python.design.blog’.rsplit(‘.’, 1) [‘python.design’, ‘blog’]
Примечание. Результатом работы методов split() и rsplit() будет список (англ. list). Литералами списка являются [квадратные скобки], внутри которых через запятую могут находиться любые объекты. Говоря простым языком, список — один из способов хранить данные в количестве больше одного.
partition(), rpartition()
Близнецом split() и rsplit() являются partition() и rpartition(). Как обычно, различие в деталях: partition() разбивает строку всегда на три части по принципу: до шаблона (в мануале именуется head), шаблон (separator), после шаблона (tail). Если шаблон не обнаружится, вернутся две пустые строки и изначальная строка.
>>> ‘Пример работы метода partition’.partition(‘ ‘) (‘Пример’, ‘ ‘, ‘работы метода partition’) >>> ‘Пример работы метода rpartition’.rpartition(‘ ‘) (‘Пример работы метода’, ‘ ‘, ‘rpartition’) >>> ‘Пример работы метода partition’.rpartition(‘аа’) (», », ‘Пример работы метода rpartition’) >>> ‘Пример работы метода partition’.partition(‘аа’) (‘Пример работы метода partition’, », »)
Примечание.
Ещё одним отличием split() от partition() является то, что последний реализует вывод в круглых скобках, а не квадратных. Литералами (круглых скобок) обозначается кортеж (англ. tuple), и он также может содержать в себе данные, как и [список]. Их отличие в том, что кортеж нельзя изменить после его создания — это накладывает некоторые ограничения на работу с ним, зато он гораздо быстрее. В работе с методами строки нет принципиального отличия в том, в списке или кортеже мы получаем результат, но это важно для обработки большого массива данных, поэтому в некоторых случаях обработка результата после применения метода partition() может дать прирост в скорости по сравнению с split(). К тому же, поведение partition() более предсказуемо — мы всегда получаем три элемента.
join()
Разумеется, что строки можно не только разбивать на подстроки, но и собирать их обратно. Помимо простой конкатенации (+), рассмотренной выше, используется метод join(). Работа с ним немного отличается от вышеописанных методов: сначала в кавычках указывается разделитель, с которым будет собрана строка, далее — сам метод, а в скобках — любая последовательность (список, кортеж, строка), которую необходимо собрать:
>>> ‘.’.join([‘python’, ‘design’, ‘blog’]) ‘python.design.blog’ >>> ‘ ‘.join(‘Hello, world’) ‘H e l l o , w o r l d’ >>> ‘/’.join((‘C:’, ‘Windows’, ‘Temp’)) ‘C:/Windows/Temp’
Решение проблемы с окончанием строки на обратный слэш ()
Интересная ситуация складывается, если адрес C:/Windows/Temp необходимо собрать с обратным слэшем () или наша строка будет содержать экранированную последовательность, как, например, ‘C:new.txt’, которая содержит перевод строки (‘n’).
>>> ‘C:new.txt’ ‘C:new.txt’ >>> print(‘C:new.txt’) C: ew.txt
Для таких случаев предусмотрен тип строки, где экранирование будет игнорироваться — это так называемая «сырая» строка (raw string). Обозначается буквой r или R перед первым литералом:
>>> r’C:new.txt’ ‘C:\new.txt’ >>> print(r’C:new.txt’) C:new.txt
У этого способа есть один серьёзный недостаток: обратный слэш в конце строки не решает проблемы:
>>> r’C:WindowsTemp’ SyntaxError: EOL while scanning string literal
Так получается из-за того, что после обратного слэша интерпретатор ожидает экранированный символ или последовательность символов, поэтому экранирует кавычку:
>>> ».join((‘C:’, ‘Windows’, ‘Temp’)) SyntaxError: invalid syntax
«Неверный синтаксис» — не очень красноречивая причина ошибки. Более очевидная причина выйдет при транслировании строки ‘’ напрямую в интерпретатор:
>>> » SyntaxError: EOL while scanning string literal
EOL (End of line) — конец строки там, где не ожидалось: мы экранировали кавычку и не закрыли строку, оттого такое странное поведение. Экранирование экранирования тоже плохая идея, если только не передать эту строку в print(), где экранированная последовательность обработается как положено:
>>> ‘\’ ‘\’ >>> print(‘\’) >>> print(‘\’.join((‘C:’, ‘Windows’, ‘Temp’))) C:WindowsTemp
Также могут пригодиться и другие решения этой проблемы, через срез и конкатенацию, результат идентичен:
>>> print(r’C:WindowsTemp\'[:-1]) C:WindowsTemp >>> print(r’C:WindowsTemp’ ‘\’) C:WindowsTemp >>> print(‘\’.join((‘C:’, ‘Windows’, ‘Temp’, »))) C:WindowsTemp
Нет необходимости обязательно экранировать обратный слэш, если он встречается в середине строки, но сделав это, Вы обезопасите себя от «выстрела в ногу».
Выстрелить себе в ногу — расхожий мем, основанный на том, что играя с заряженным пистолетом велик риск себя ранить, то есть, если проводить аналогию: делая неочевидные вещи (решая проблему не тем способом), велик риск потом поломать это.
strip(), lstrip(), rstrip()
Продолжаем работать со строкой. На этот раз метод strip() имеет целых двух сородичей, это lstrip() и rstrip(). Метод служит для удаления сиволов в начале и/или конце строки, а по умолчанию удаляет пробельные символы (‘ ‘, ‘n’, ‘t’):
>>> ‘nHello, worldn’.strip() ‘Hello, world’ >>> ‘nHello, worldn’.rstrip() ‘nHello, world’ >>> ‘nHello, worldn’.lstrip() ‘Hello, worldn’
Важно, что в отличие от методов, принимающих подстроку за образец сравнения, strip() принимает подстроку как символы, которые будут встречаться в начале и/или конце строк в любом порядке:
Главное, не применять strip() повсеместно, иначе это гарантированно выйдет боком:
>>> ‘hello, world’.strip(») ‘llo, worl’
а пользоваться более подходящими инструментами, например, методом replace(), а ещё лучше — специализированными модулями, предназначенными для работы с html, например, модулем beautifulsoup:
>>> ‘hello, world’.replace(», »).replace(», ») ‘hello, world’
Примечание. Ничто не мешает Вам нагромождать методы, как в примере выше, главное, чтобы код при этом оставался понятным.
center(), zfill(), ljust(), rjust()
Для фиксирования ширины строки существуют методы center(), zfill(), ljust() и rjust(). Если не указан второй аргумент, строка заполняется пробелами.
>>> ‘Hello, world’.center(20) ‘ Hello, world ‘ >>> ‘Hello, world’.center(20, ‘_’) ‘____Hello, world____’ >>> ‘Hello, world’.ljust(20) ‘Hello, world ‘ >>> ‘Hello, world’.rjust(20) ‘ Hello, world’ >>> ‘Hello, world’.ljust(20, ‘_’) ‘Hello, world________’ >>> ‘Hello, world’.rjust(20, ‘_’) ‘________Hello, world’
Метод zfill() отличается тем, что принимает только один аргумент и заполняет пространство слева нулями:
>>> ‘1234.56’.zfill(9) ‘001234.56’
upper(), lower(), swapcase(), capitalize(), title()
Также существуют модификаторы строки, не изменяющие его длину, а работающие с символами внутри. Это методы upper(), lower(), swapcase(), capitalize() и title(), и служат они для приведения строки к определённому виду без лишних телодвижений: к верхнему (upper) или нижнему регистру (lower), инвертированию регистра (swapcase), приведению первой буквы в верхний, а остальных — в нижний регистр (capitalize) или к американскому типу заголовков, Когда Каждое Слово Пишется С Заглавной Буквы (title).
>>> ‘Hello, world’.upper() ‘HELLO, WORLD’ >>> ‘Hello, world’.lower() ‘hello, world’ >>> ‘Hello, world’.swapcase() ‘hELLO, WORLD’ >>> ‘heLLO, WorLd’.capitalize() ‘Hello, world’ >>> ‘Hello, world’.title() ‘Hello, World’
isdigit(), isalpha(), isalnum(), islower(), isupper(), isspace(), istitle(), startswith(), endswith()
Также существуют методы, позволяющие проверить строку на наличие каких-то данных без проведения сложных проверок. Это методы isdigit(), isalpha(), isalnum(), islower(), isupper(), isspace(), istitle(), startswith(), endswith(), результатом их работы будет булевое значение True или False.
Метод isdigit() проверяет строку, состоит ли она из цифр (0-9), даже точка для обозначения десятичной части повлияет на результат:
>>> ‘123’.isdigit() True >>> ‘123.45’.isdigit() False >>> ‘1a2b3c’.isdigit() False
Метод isalpha() проверяет строку на наличие ТОЛЬКО букв, пробелы вернут False.
>>> ‘1a2b3c’.isalpha() False >>> ‘a b c’.isalpha() False >>> ‘abc’.isalpha() True
Метод isalnum() совмещает два предыдущих метода и вернёт True, даже если в строке будут только буквы или цифры.
>>> ‘1a2b3c’.isalnum() True >>> ‘1a 2b 3c’.isalnum() False >>> ‘123’.isalnum() True >>> ‘abc’.isalnum() True
Метод isspace() проверяет строку на наличие пробелов и пробельных символов (‘ ‘, ‘n’, ‘t’ и других):
>>> ‘1 2 3’.isspace() False >>> ‘rntv ‘.isspace() True
Методы islower(), isupper() и istitle() проверяют на соответствие строки результатам работы методов-модификаторов lower(), upper() и title() соответственно.
>>> ‘Hello, world’.isupper() False >>> ‘HELLO, WORLD’.isupper() True >>> ‘Hello, world’.islower() False >>> ‘hello, world’.islower() True >>> ‘Hello, world’.istitle() False >>> ‘Hello, World’.istitle() True
Методы startswith() и endswith() проверяют строку на наличие символа в начале или конце строки соответственно. Причём endswith() может принять в аргументы кортеж со строками:
>>> ‘Hello, world’.startswith(‘H’) True >>> ‘Hello, world’.startswith(‘Hello’) True >>> ‘Hello, world’.startswith(‘h’) False >>> ‘Hello, world’.endswith(‘d’) True >>> ‘Hello, world’.endswith(‘world’) True >>> ‘Hello, worlds’.endswith((‘a’, ‘s’)) True
Проверка на вхождение в строку: in, not in
Если необходимо сделать простую проверку на вхождение подстроки в строку (без указания диапазона и получения индекса), можно воспользоваться инструкцией in, она также вернёт булевое значение:
>>> ‘world’ in ‘Hello, world’ True
Или проверить на отстутствие подстроки инструкцией not in:
>>> ‘world’ not in ‘Hello, world’ False
Источник: k1478.wordpress.com
Количество членовПрограммирование на Python.На вход программе подается последовательность слов, каждое слово на отдельной строке. Концом последовательности является одно из трех слов: «стоп», «хватит», «достаточно» (маленькими буквами, без кавычек). Напишите программу, которая выводит общее количество членов данной последовательности.Формат входных данныхНа вход программе подается последовательность слов, каждое слово на отдельной строке.Формат выходных данныхПрограмма должна вывести общее количество членов данной последовательности.Пожалуйста посчитайте пж, если можно с объяснением, можно просто код
я поменял расирения файла на .txt чтоб можно было отправить, поменяй расширение на .py. Коментарии в файле присутствуют.
-
просто после окончания цикла отними 1 от переменной kol
Источник: uchimsya.com
Печатать каждое слово в отдельной строке входной строки
У меня проблемы с выводом каждого слова в отдельной строке из входной строки в C. Вопрос из выполняемого мной задания гласит:
Возьмите предложение в качестве ввода и выведите его слова в отдельные строки.
#include int main() < int i; char s[100]; scanf(«%s», s); for(i=0; s[i]!=’