Как создать функцию для изменения каждого внешнего вида буквы на другую букву?

#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")