Операции для работы со строками: пишем игру в слова и виселицу
Чем займемся?
В предыдущих проектах мы рассмотрели мы научились работать с числами, условиями, циклами и даже списками, а вот строки мы до сих пор умеем только сравнивать. В этом разделе твоей задачей станет реализация двух текстовых игр - "игры в слова" и "висилицы".
Технически в первой игре тебе потребуется сравнивать первую букву ответа и последнюю букву предыдущего слова, а значит - нужно научиться обращаться к отдельным буквам слова. А во второй придется зайти дальше - заменять прочерки в слове на угаданные буквы. А значит - сейчас самое время разобраться со строковыми операциями в питоне!
Арифметические операции
Как и числа, строки можно складывать и умножать на число.
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) # ['М', 'Г', 'У']
**Тренируемся...**
Пользователь вводит в вашу программу небольшой текст.
Выведите через точку с запятой все слова из него, которые начинаются на букву **а**.
Пишем игру в слова
Теперь передем к задачам побольше! Напиши игру в слова, в которой пользователь играет с компьютером, загадывая слова по следующим правилам:
- каждое новое слово должно начинаться с последней буквы предыдущего (мама -> ананас -> сова -> ...);
- слова не могут повторяться;
- каждое слово - существительное в именительном падеже.
Развивать решение, как обычно стоит, от простого к сложному.
- На первом этапе можно реализовать игру для двух игроков: они по очереди вводят слова, а компьютер просто проверяет правильность - приводит к нижнему регистру и сравает первую и последнюю буквы.
- В процессе игры стоит запоминать, какие слова уже встечались, чтобы нельзя было использовать слова повторно.
- Можно добавить список слов из списка существительных в русском языке, чтобы проверять, что слова, которые вводят игроки, действительно существуют.
- Можно использовать этот же список, чтобы играть в одиночку, либо по всему списку (тогда выиграть невозможно), либо отдельно запоминать слова, которые уже вводил сам игрок в предыдущих играх в файле, чтобы в следующих использовать их (т.е. компьютер с каждой игрой "умнеет").
Пишем виселицу
А теперь более сложная задача - напиши игру в "висилицу": в ней программа загадывает пользователю слова из прописанного в ней списка, а пользователь должен отгадать его по буквам.
На каждом ходу пользователь видит слово из символов '_', уже угаданные буквы показываются. Пользователь вводит по одной букве, если буква есть в слове - она открывается (причем во всех позициях), если нет - уменьшается число жизней.
Например, если ввести букву м, то слово превратиться в м_м_
.
При проигрыше или выигрыше игра начинается с начала.