Основы программирования в Python

Алла Тамбовцева, НИУ ВШЭ

Работа со строками

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

In [15]:
phrase = "питон греется на солнышке"

Наша фраза ‒ предложение, давайте сделаем первую букву строки заглавной.

In [16]:
phrase = phrase.capitalize()
phrase
Out[16]:
'Питон греется на солнышке'

Метод .capitalize(), как и все методы на строках, не создает новую строку сам и не вносит изменения в исходную строку (строки вообще относятся к неизменяемым объектам в Python). Поэтому, чтобы сохранить внесенные изменения, мы перезаписали переменную phrase.

Проверим, правда ли, что наша новая строка начинается с заглавной П.

In [17]:
phrase.startswith("П") # правда
Out[17]:
True

А теперь проверим, правда ли, что наша фраза заканчивается точкой.

In [18]:
phrase.endswith(".")
Out[18]:
False

Исправим это! Склеим нашу строку и точку (эта операция называется конкатенацией):

In [19]:
phrase = phrase + "."
phrase
Out[19]:
'Питон греется на солнышке.'

Теперь получили полноценное предложение. Давайте проверим, а правда ли, что наша фраза состоит полностью из букв (без цифр, пробелов и иных символов)?

In [20]:
phrase.isalpha() # неправда
Out[20]:
False

Вполне ожидаемо: в нашей строке есть пробелы и даже точка.

Может возникнуть вопрос: а зачем нам проверять, из каких символов состоит строка? Ведь даже, если строка состоит из цифр, числом она автоматически не станет. Давайте рассмотрим две ситуации, в которых очень полезно знать, какие символы входят в нашу строку.

Ситуация 1

Пользователь должен придумать пароль для своей учетной записи. Пароль должен состоять только из цифр и букв.

In [24]:
password = input("Введите пароль: ")

if password.isalnum() == False:
    print("Пароль должен состоять только из букв и цифр!")
Введите пароль: pass17
In [25]:
password = input("Введите пароль: ")

if password.isalnum() == False:
    print("Пароль должен состоять только из букв и цифр!")
Введите пароль: tututu-17
Пароль должен состоять только из букв и цифр!

В примере выше мы использовали метод .isalnum(), который позволяет проверить, составлена ли строка только из букв (alpha) и цифр (num).

Ситуация 2

Есть список txt-файлов, и мы хотим их автоматически рассортировать, зная, что если название файла состоит из цифр, то это текст для анализа, а если нет, то это файл с результатами анализа.

In [28]:
files = ["100.txt", "110.txt", "result1.txt", "121.txt", "result2.txt", "123.txt", "result3.txt"]
In [30]:
ans = []
res = []

for f in files:
    name = f.split(".")[0] # разобьем названия по точке и возьмем первый элемент - до txt
    if name.isnumeric():
        ans.append(f)
    else:
        res.append(f)
print(ans)
print(res)
['100.txt', '110.txt', '121.txt', '123.txt']
['result1.txt', 'result2.txt', 'result3.txt']

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

Внимание: для тренировки создайте папку с ненужными или пустыми файлами,чтобы случайно ничего не повредить. Отменить действие будет невозможно.

Какие еще полезные операции можно проводить со строками? Заменять символы. Для этого есть метод .replace().

In [31]:
address = "Г.Москва, ул.Мясницкая, д. 25"

Заменим сокращение "Г." на слово "город":

In [38]:
address = address.replace("Г.", "город ")
address
Out[38]:
'город Москва, ул.Мясницкая, д. 25'
In [40]:
address = address.replace("д. 25", "д.25")
address
Out[40]:
'город Москва, ул.Мясницкая, д.25'

Методы можно "наслаивать" друг на друга: ставить точку и продолжать.

In [42]:
sent = "Питон Греется На Солнышке"
sent = sent.replace("Г", "г").replace("Н", "н").replace("С", "с")
sent
Out[42]:
'Питон греется на солнышке'

Что еще полезного можно делать со строками? Менять регистр.

In [44]:
name = input("Введите имя и фамилию: ")
Введите имя и фамилию: аЛЛА тАМБОВЦЕВА

Знакомая история, да? Поправим:

In [45]:
name.swapcase() # ура
Out[45]:
'Алла Тамбовцева'

Финальный аккорд: посчитаем, сколько раз разные символы встречаются в строке.

In [46]:
phrase
Out[46]:
'Питон греется на солнышке.'
In [48]:
phrase.count("е")
Out[48]:
3
In [49]:
phrase.count("т")
Out[49]:
2

А теперь сделаем это в цикле ‒ для всех символов в строке (только для этого нам потребуются множества: чтобы исключить повторения).

In [50]:
symbols = set(phrase)
symbols
In [54]:
for s in symbols:
    print(s, ":", phrase.count(s))
  : 3
е : 3
и : 1
с : 2
т : 2
г : 1
а : 1
ы : 1
о : 2
П : 1
ш : 1
л : 1
к : 1
р : 1
. : 1
н : 3
я : 1

А как найти положение слова в тексте? Для этого есть метод .find().

In [63]:
phrase.find("греется")
Out[63]:
6

Это означает, что слово греется начинается с символа, имеющего в строке индекс 6. Проверим глазами:

In [64]:
phrase
Out[64]:
'Питон греется на солнышке.'

Все верно.

Если такого слова (словом мы называем любую подстроку, то есть последовательность символов) в строке нет, то выводится индекс -1.

In [65]:
phrase.find("солнце")
Out[65]:
-1