Уроки технологии
Технология Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Строки в Python

Строки Python — это один из основных и наиболее распространенных типов, используемых в языке. Взаимодействие со строками, включая форматирование и замену текста, является основным навыком для разработчика при работе с кодом Python.

Сценарий: создание программы для описания фактов о Луне

Представьте, что вы создаете программу для описания некоторых измерений и других сведений о Луне. Для формирования выходных данных потребуется использовать различные строковые операции.

К концу этого модуля вы сможете работать со строковыми операциями:

использовать специальные строковые методы;
использовать переменные, чтобы ввести значения в текст;
применять другие дополнительные методы форматирования, чтобы изменить способ представления текста.

Основы работы со строками в Python

Хотя работа со строками в Python выглядит простой и очевидной, в строковых правилах присутствуют определенные сложности, которые важно понимать.

Неизменность строк

В Python строки являются неизменяемыми. То есть они не могут изменяться. Это свойство строкового типа может вызывать удивление, так как Python не выдает ошибки при изменении строк.

В примере для этого модуля у вас есть один факт о Луне, назначенный переменной, и необходимо добавить туда еще один факт (предложение). При использовании интерпретатора Python кажется, что добавление второго факта приведет к изменению переменной:

>>> fact = "The Moon has no atmosphere."
>>> fact + "No sound can be heard on the Moon."
'The Moon has no atmosphere.No sound can be heard on the Moon.'

Хотя может показаться, что мы изменили переменную fact, быстрая проверка значения показывает, что исходное значение не изменилось:

>>> fact
'The Moon has no atmosphere.'

Хитрость заключается в том, что необходимо использовать возвращаемое значение. При добавлении строк Python не изменяет их, а возвращает новую строку в качестве результата. Чтобы сохранить этот новый результат, назначьте его новой переменной:

>>> two_facts = fact + "No sound can be heard on the Moon."
>>> two_facts
'The Moon has no atmosphere.No sound can be heard on the Moon.'

Использовании кавычек

Строки Python можно заключать в одинарные, двойные или тройные кавычки. Хотя они являются взаимозаменяемыми, лучше всего согласованно использовать один тип во всем проекте. Например, в следующей строке используются двойные кавычки:

moon_radius = "The Moon has a radius of 1,080 miles"

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

'The "near side" is the part of the Moon that faces the Earth'

Аналогично, если имеются одинарные кавычки (или апостроф, как в слове Moon’s в следующем примере) в любом месте строки, заключите всю строку в двойные кавычки:

"We only see about 60% of the Moon's surface"

Несоблюдение чередования одинарных и двойных кавычек может привести к тому, что интерпретатор Python выдаст синтаксическую ошибку, как показано ниже:

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

"""We only see about 60% of the Moon's surface, this is known as the "near side"."""

Многострочный текст

Существует несколько различных способов обозначения нескольких строк текста с помощью одной переменной. Наиболее распространенные способы:

Используйте символ новой строки (\n).
Используйте тройные кавычки (""").

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

>>> multiline = "Facts about the Moon:\n There is no atmosphere.\n There is no sound."
>>> print(multiline)
Facts about the Moon:
 There is no atmosphere.
 There is no sound.

Тот же результат можно получить с помощью тройных кавычек:

>>> multiline = """Facts about the Moon:
...  There is no atmosphere.
...  There is no sound."""
>>> print(multiline)
Facts about the Moon:
There is no atmosphere.
There is no sound

Строковые методы в Python

Строковые методы являются частью типа str.

>>> heading = "temperatures and facts about the moon"
>>> heading.title()
'Temperatures And Facts About The Moon'

Разбиение строки

Распространенным строковым методом является .split(). Без аргументов этот метод разделит строку по каждому пробелу. При этом будет создан список всех слов или цифр, отделенных пробелом:

>>> temperatures = """Daylight: 260 F
... Nighttime: -280 F"""
>>> temperatures .split()
['Daylight:', '260', 'F', 'Nighttime:', '-280', 'F']

Если требуется цикл для обработки или извлечения информации, или загрузка данных из текстового файла или другого ресурса удобно использовать метод .split() с аргументом, например .split('\n')

Поиск строки

Кроме использования цикла, некоторые строковые методы могут искать содержимое перед обработкой без потребности в цикле. Предположим, что у вас есть два предложения, описывающих температуру на различных планетах и лунах, но вас интересуют только температуры, связанные с нашей Луной. То есть, если предложения не касаются Луны, они не должны обрабатываться для извлечения информации.

Самый простой способ узнать, присутствует ли в строке слово, символ или группа символов, не требует использования метода:

>>> "Moon" in "This text will describe facts about the Moon"
True

Подход к поиску позиции определенного слова в строке заключается в использовании метода .find():

>>> temperatures = """Saturn has a daytime temperature of -170 degrees Celsius,
... while Mars has -28 Celsius."""
>>> temperatures.find("Moon")
-1

Метод .find() возвращает значение -1, если слово не найдено, либо возвращает индекс (число, обозначающее место в строке).

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

>>> temperatures.count("Mars")
1

Строки в Python чувствительны к регистру, что означает, что Луна и луна считаются разными словами. Чтобы выполнить сравнение без учета регистра, можно преобразовать строку в строчные буквы с помощью метода .lower():

>>> "The Moon And The Earth".lower()
'the moon and the earth'

Аналогично методу .lower() для строк есть метод .upper(), который делает противоположное, преобразуя каждый символ в верхний регистр.

При поиске и проверке содержимого более надежным подходом является перевод строки в нижний регистр, чтобы несовпадение регистра не мешало нахождению совпадения. Например, если вы подсчитываете количество вхождений слова файл, метод не будет учитывать вхождения Файл, хотя это одно и то же слово. С помощью метода .lower() можно изменить все символы на нижний регистр.

Проверка содержимого

Иногда приходится обрабатывать текст для извлечения сведений, не имеющих единого представления.

Чтобы извлечь среднюю температуру на Марсе, можно использовать следующие методы:

>>> temperatures = "Mars Average Temperature: -60 C"

>>> parts = temperatures.split(':') # Строка разделяется по :, в результате чего получается список из двух элементов. 
>>> parts
['Mars average temperature', ' -60 C']
>>> parts[-1] # возвращается последний элемент
' -60 C'

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

>>> mars_temperature = "The highest temperature on Mars is about 30 C"
>>> for item in mars_temperature.split():
...     if item.isnumeric():
...         print(item)
...
30

Важно!

Может показаться удивительным, что “-70”.isnumeric() возвратит False. Это связано с тем, что все символы в строке должны быть числовыми, а дефис (-) не является числом. Если необходимо проверить отрицательные числа в строке, метод .isnumeric() работать не будет - необходимо использовать метод .startswith("-"):

>>> "-60".startswith('-')
True

Преобразование текста

Метод .replace() можно использовать для поиска и замены вхождений символа или группы символов:

>>> "Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius.".replace("Celsius", "C")
'Saturn has a daytime temperature of -170 degrees C, while Mars has -28 C.'

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

>>> text = "Temperatures on the Moon can vary wildly."
>>> "temperatures" in text
False
>>> "temperatures" in text.lower()
True

После разделения текста и выполнения преобразований, возможно, потребуется снова объединить все части. Так же, как метод .split() может разделять символы, метод .join() может соединить их обратно.

Методу .join() требуется итерируемое значение (например, список Python) в качестве аргумента, поэтому его использование отличается от других строковых методов:

>>> moon_facts = ["The Moon is drifting away from the Earth.", "On average, the Moon is moving about 4cm every year"]
>>> '\n'.join(moon_facts)
'The Moon is drifting away from the Earth.\nOn average, the Moon is moving about 4cm every year'
# символ новой строки '\n' используется для объединения каждого элемента в списке.

Формат строки в Python

Кроме преобразования текста и выполнения основных операций, таких как сопоставление и поиск, важно форматировать текст при отображении информации. Самый простой способ представления текстовой информации с помощью Python заключается в использовании функции print(). Вы поймете, что информацию из переменных и других структур данных нужно получать в виде строк, которые может использовать print().

В этом уроке вы узнаете о нескольких допустимых способах включения значений переменных в текст с помощью Python.

Форматирование символа процента (%)

Заполнитель имеет значение %s,, и переменная передается в текст после символа % за пределами строки. Вот как можно использовать символ % для форматирования:

>>> mass_percentage = "1/6"
>>> print("On the Moon, you would weigh about %s of your weight on Earth" % mass_percentage)
On the Moon, you would weigh about 1/6 of your weight on Earth

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

>>> print("""Both sides of the %s get the same amount of sunlight,
... but only one side is seen from %s because
... the %s rotates around its own axis when it orbits %s.""" % ("Moon", "Earth", "Moon", "Earth"))
Both sides of the Moon get the same amount of sunlight,
but only one side is seen from Earth because
the Moon rotates around its own axis when it orbits Earth.

Совет

Хотя этот метод по-прежнему является допустимым способом форматирования строк, он может привести к ошибкам и уменьшить ясность кода, если вы работаете с несколькими переменными. Для этих целей лучше подходит один из следующих вариантов форматирования.

метод format() ;

Метод .format() использует фигурные скобки ({}) в качестве заполнителей в строке, а присваивание переменных для замены текста.

>>> mass_percentage = "1/6"
>>> print("On the Moon, you would weigh about {} of your weight on Earth".format(mass_percentage))
On the Moon, you would weigh about 1/6 of your weight on Earth

Вам не нужно назначать повторяющиеся переменные несколько раз, делая код менее подробным, так как требуется назначить меньшее число переменных:

>>> print("""You are lighter on the {0}, because on the {0} 
... you would weigh about {1} of your weight on Earth""".format("Moon", mass_percentage))
You are lighter on the Moon, because on the Moon you would weigh about 1/6 of your weight on Earth

Вместо пустых фигурных скобок можно использовать числа. {0} означает использование первого аргумента (с нулевым индексом) для .format(), в данном случае это Moon. Простое повторение {0} работает нормально, но это снижает удобочитаемость. Чтобы повысить удобочитаемость, используйте аргументы из ключевых слов в .format(), а затем ссылайтесь на те же аргументы в фигурных скобках:

>>> print("""You are lighter on the {moon}, because on the {moon} 
... you would weigh about {mass} of your weight on Earth""".format(moon="Moon", mass=mass_percentage))
You are lighter on the Moon, because on the Moon you would weigh about 1/6 of your weight on Earth

Сведения о f-строках

Начиная с версии Python 3.6 можно использовать f-строки. Эти строки выглядят как шаблоны с теми же именованными переменными, что и в коде. Использование f-строк в предыдущем примере будет выглядеть следующим образом:

>>> print(f"On the Moon, you would weigh about {mass_percentage} of your weight on Earth")
On the Moon, you would weigh about 1/6 of your weight on Earth

Переменные размещаются в фигурных скобках, а строка должна использовать префикс f.

В отличие от f-строк, которые менее детализированы по сравнению с любым другим вариантом форматирования, можно использовать выражения внутри фигурных скобок. Эти выражения могут быть функциями или прямыми операциями. Например, если нужно представить значение 1/6 в виде процента с одним десятичным разрядом, можно использовать функцию round() напрямую:

>>> round(100/6, 1)
16.7

В f-строках не нужно присваивать значение переменной заранее:

>>> print(f"On the Moon, you would weigh about {round(100/6, 1)}% of your weight on Earth")
On the Moon, you would weigh about 16.7% of your weight on Earth

Использование выражения не требует вызова функции. Любой из строковых методов также является допустимым. Например, в строке можно применить особый регистр для создания заголовка:

>>> subject = "interesting facts about the moon"
>>> f"{subject.title()}
'Interesting Facts About The Moon'

Сводка

Строки Python — это один из наиболее распространенных типов, используемых в языке. В этом модуле вы узнали о некоторых свойствах строк и наиболее распространенных методах работы с ними. Наконец, вы познакомились со способами форматирования строк тремя различными методиками:

Использование модуля форматирования %.
Использование .format() в строке.
Использование f-строк.

Эти базовые знания помогут вам при работе с другими структурами данных в Python, которые хорошо совместимы со строками, такими как словари и списки.