#python
#питон
Вопрос:
У меня есть имя, скажем, «Джон».
Я хочу создать функцию, которая изменит букву «о» на «а».
Вот что я придумал
def replace(seq,target,rplcmt): for letter in seq: if letter == target: lid = seq.find(letter) new_seq = seq[0:lid] rplcmt seq[lid 1::] return new_seq name = "John" newname = replace(name,"o","a") print(newname) "Jahn"
Это отлично работает и возвращает «Jahn», но что, если я захочу изменить имя, например «Johonas» (например)
def replace(seq,target,rplcmt): for letter in seq: if letter == target: lid = seq.find(letter) new_seq = seq[0:lid] rplcmt seq[lid 1::] return new_seq name = "Johonas" newname = replace(name,"o","a") print(newname) "Jahonas"
Он возвращает Яхонаса, поэтому я попытался сделать заявление «если», например так
def replace(seq,target,rplcmt): for letter in seq: if letter == target: lid = seq.find(letter) new_seq = seq[0:lid] rplcmt seq[lid 1::] if target not in new_seq: return new_seq name = "Johonas" newname = replace(name,"o","a") print(newname) None
Однако это не возвращает ничего, и я, честно говоря, не знаю, как это исправить, любая помощь заметна.
Комментарии:
1. Похоже, ваша функция-это однострочная:
return ''.join(rplcmt if x == target else x for x in seq)
2. Но почему вы избегаете
replace
метода объекта? Это исключительно в образовательных целях?
Ответ №1:
Проблема с вашим текущим решением заключается в том, что, когда вы возвращаетесь, функция завершает работу, прежде чем проверить, есть ли внутри еще target
s seq
.
Вы должны создать новую переменную с именем current_seq
, инициализировать ее seq
и вместо возврата изменить значение этой переменной. Вы также должны использовать цикл while, поэтому вы выполняете итерацию только при необходимости:
def replace(seq,target,rplcmt): current_seq = seq while target in current_seq: lid = current_seq.find(target) current_seq = current_seq[0:lid] rplcmt current_seq[lid 1::] return current_seq assert(replace("John", "o", "a") == "Jahn") assert(replace("Johonas", "o", "a") == "Jahanas")
С помощью приведенного выше решения вы current_seq
выполняете поиск target
дважды: первый вход target in current_seq
и второй вход current_seq.find(target)
. Для повышения производительности вы можете использовать бесконечный цикл и прерываться при выполнении определенного условия, выполняя поиск current_seq
только один раз:
def replace(seq,target,rplcmt): current_seq = seq while True: lid = current_seq.find(target) if lid == -1: break current_seq = current_seq[0:lid] rplcmt current_seq[lid 1::] return current_seq
В качестве альтернативы вы можете просто использовать str.replace
метод:
assert(str.replace("John", "o", "a") == "Jahn") assert(str.replace("Johonas", "o", "a") == "Jahanas")