Операции для работы со строками: пишем игру в слова и виселицу

Чем займемся?

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

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

Арифметические операции

Как и числа, строки можно складывать и умножать на число.

print("Марко" + "Поло") # выведет МаркоПоло
print("аз" * 10) # выведет азазазазазазазазазаз

Тренируемся...

Пользователь вводит строку и число: выведи на экран строку, повторенную заданное число раз.

азаз
4
азазазазазазазаз

Определение длины строки

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

s = "Мама мыла раму, папа майнил биткоины."
print(len(s)) # это 37

Тренируемся...

Пользователь вводит две строки, выведи наиболее длинную строку (из этих двух) и ее длину.

Обращение к конкретному символу

К каждому символу в строке можно обратиться по номеру. Обрати внимание - первый символ имеет номер 0. Обращение к символу с номером len(s) или больше приведет к возникновению ошибки - т.к. таких символов в строке нет.

s = "Мама мыла раму, папа майнил биткоины."
print(s[0]) # это М - первая буква
print(s[3]) # это а - четвертая буква

Также в питоне можно использовать обратную индексацию - отрицательными числами. Например, вот так можно получить последний символ:

s = "Мама мыла раму, папа майнил биткоины."
print(s[-1]) # это . - последний символ
print(s[-2]) # это ы - предпоследний символ.

Тренируемся...

Пользователь вводит строку, выведи пятый символ с конца.

Смена регистра

Можно одной командой сделать все буквы строчными или заглавными.

s = "Мама мыла раму, папа майнил биткоины."
print(s.lower()) # мама мыла раму, папа майнил биткоины.
print(s.upper()) # МАМА МЫЛА РАМУ, ПАПА МАЙНИЛ БИТКОИНЫ.

Тренируемся...

В E-mail адресе регистр символов не имеет значения, например, roctbb@gmail.com и RoctBB@gmail.com - это один и тот же адрес.

Пользователь вводит два email адреса, твоя задача - сказать одинаковые ли они.

roctbb@gmail.com
RoctBB@gmail.com
Адреса совпадают!
roctbb@gmail.com
RoctBB@ya.ru
Адреса не совпадают!

Срезы

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

s = "Мама мыла раму, папа майнил биткоины."
print(s[5:9]) # мыла - часть строки от 5 символа до 9 (не включая 9)

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

s = "Мама мыла раму, папа майнил биткоины."
print(s[:9]) # Мама мыла - часть строки от начала  до 9 символа (не включая 9)
print(s[5:]) # мыла раму, папа майнил биткоины. - от 5 символа до 9 конца
print(s[5:9:2]) # мл - от 5 символа до 9 с шагом 2 (не включая 9)
print(s[::3]) # Маы м пмн ти. - от начала до конца с шагом 3

С помощью среза можно даже развернуть строку задом наперед!

s = "Мама мыла раму, папа майнил биткоины."
print(s[::-1]) # .ыниоктиб линйам апап ,умар алым амаМ - от начала до конца с шагом -1, т.е. задом наперед

Тренируемся...

Пользователь вводит строку. Выведи на экран первые три символа, последние три символа и строку задом наперед, пропуская каждый второй символ.

Поиск и замена, подсчет

Конечно, эти операции в питоне также уже реализованы:

s = "Мама мыла раму, папа майнил биткоины."
print(s.find('мыла')) # 5 - т.к. слово мыла начинается с 5 позиции
print(s.find('готовила')) # -1 - т.к. слова готовила в строке нет
print(s.replace('биткоины', 'доджкоины')) # Мама мыла раму, папа майнил доджкоины.
print(s.count('а')) # 7

Также для поиска можно использовать команду in.

if "мыла" in s:
    print("найдено")

Тренируемся...

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

Лол, кек, чебурек.
В тексте недопустимая лексика!
Исправленный текст: ***, ***, чебурек.

Приведение к строке

Также, как строку можно преобразовать в число командой int, число (и некоторые другие типы) можно преобразовать в строку командой str.

a = str(1)

Форматирование строки

Часто возникает необходимость соединять строки и числа в одну строку. Это можно сделать по разному, например, вот так:

print("Папа намайнил "+str(10)+" доджкоинов, а мама - "+str(20)+" доджкоинов.")

Этот подход работает, но выглядит не очень красиво. Можно сделать удобнее:

print("Папа намайнил {father_coins} доджкоинов, а мама - {mother_coins} доджкоинов.".format(father_coins = 10, mother_coins = 20))

Или так:

print("Папа намайнил {} доджкоинов, а мама - {} доджкоинов.".format(10, 20))

А в новее python 3.6 можно еще круче:

print(f"Папа намайнил {10} доджкоинов, а мама - {10 + 10} доджкоинов.")

Тренируемся...

Напишите программу, которая просит пользователя ввести два имени, а затем подставляет их в анекдот и выводит на экран (текст шаблона стоит выбрать самостоятельно).

Петя
Вася

Вася и Петя пошли получать зарплату, но в бухгалтерии все перепутали, и Вася получил за Петя, а Петя за Вася.

Списки и строки

А теперь - самое полезное! Иногда в прикладных задачах возникает необходимость разбить строку на части (например, на отдельные слова или буквы). Для этого у строки есть готовый метод split.

s = "Привет, как дела? Как погода? Азаза!"
# разрезаем строку по пробелам, получаем список
words = s.split(' ')
print(words)
# ['Привет,', 'как', 'дела?', 'Как', 'погода?', 'Азаза!']

Есть и обратная операция - join, она позволяет склеить элементы списка в строку, используя разделитель.

questions = ['списки', 'строки', 'переменные']
s = ', '.join(questions)

print(s)
# списки, строки, переменные

С помощью нее, например, можно менять строки, предварительно превращая их в список, а затем собирая обратно.

# нужно исправить ошибку
word = 'малоко'

# делаем список букв
letters = []
for letter in word:
    letters.append(letter)

# исправляем ошибку
letters[1] = 'о'

# собираем обратно
word = ''.join(letters)

print(word)

Разбить строку без пробелов на буквы с помощью метода split не получится, но обойтись без цикла for все еще можно. Кроме функций str и int, которые преобразуют числа в строки и наоборот, в питоне есть функция list. С ее помощью можно разбить строку на символы:


s = 'МГУ'
letters = list(s)
print(letters) # ['М', 'Г', 'У']

**Тренируемся...**

Пользователь вводит в вашу программу небольшой текст.

Выведите через точку с запятой все слова из него, которые начинаются на букву **а**.

Пишем игру в слова

Теперь передем к задачам побольше! Напиши игру в слова, в которой пользователь играет с компьютером, загадывая слова по следующим правилам:

  • каждое новое слово должно начинаться с последней буквы предыдущего (мама -> ананас -> сова -> ...);
  • слова не могут повторяться;
  • каждое слово - существительное в именительном падеже.

Развивать решение, как обычно стоит, от простого к сложному.

  • На первом этапе можно реализовать игру для двух игроков: они по очереди вводят слова, а компьютер просто проверяет правильность - приводит к нижнему регистру и сравает первую и последнюю буквы.
  • В процессе игры стоит запоминать, какие слова уже встечались, чтобы нельзя было использовать слова повторно.
  • Можно добавить список слов из списка существительных в русском языке, чтобы проверять, что слова, которые вводят игроки, действительно существуют.
  • Можно использовать этот же список, чтобы играть в одиночку, либо по всему списку (тогда выиграть невозможно), либо отдельно запоминать слова, которые уже вводил сам игрок в предыдущих играх в файле, чтобы в следующих использовать их (т.е. компьютер с каждой игрой "умнеет").

Пишем виселицу

А теперь более сложная задача - напиши игру в "висилицу": в ней программа загадывает пользователю слова из прописанного в ней списка, а пользователь должен отгадать его по буквам.

https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%81%D0%B5%D0%BB%D0%B8%D1%86%D0%B0_(%D0%B8%D0%B3%D1%80%D0%B0)

На каждом ходу пользователь видит слово из символов '_', уже угаданные буквы показываются. Пользователь вводит по одной букве, если буква есть в слове - она открывается (причем во всех позициях), если нет - уменьшается число жизней.

Например, если ввести букву м, то слово превратиться в м_м_.

При проигрыше или выигрыше игра начинается с начала.