Создайте функцию, которая на вход получает строку и заменяет в ней все буквы на символ "*". А затем выводит полученную строку

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

  def my_fun(s="Машинное обучение"):
      sl =""
      i =0
      for i in s:
          if s == 'Mашинное обучение':
              s = "*"
              i += 1
              sl+=s
      
          print(sl)
          print(i)
  my_fun()

Ответы (4 шт):

Автор решения: Сергей

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

Детальный разбор см.в комментариях ниже.

# Исправлены отступы относительно первоначального кода в вопросе, иначе не работает
# Кавычки и апостроф - разные знаки, в условии равенства не будет   
def my_fun(s="Машинное обучение"):
    sl = ""
    # Переменная i не используется в виде int - инициализация и итерация не нужны тогда
    # i = 0
    # Цикл выполняет одно и то же, идя по каждой букве, можно сделать проще, вынеся if из цикла
    for i in s:
        # Код выполняет действия только если на входе ничего нет, в остальных случаях
        # - простая печать буквы и пробела много раз
        if s == 'Mашинное обучение':
            s = "*"
            # Переменная i не используется в виде int - инициализация и итерация не нужны тогда
            #i += 1
            sl += s
        print(sl)
        print(i)

my_fun()
→ Ссылка
Автор решения: Андрей Посмитный

Как вариант, решения

def my_fun(s="Машинное обучение", rep="*"):
    ns = list(("").join(s))
    for i in range(len(ns)):
        if ns[i].isalpha():
            ns[i] = rep
    
    ns = ("").join(ns)
    
    print(f"Input word {s}")
    print(f"Output word {ns}")
    return ns


my_fun()
→ Ссылка
Автор решения: Александр

Если задание сформулировано также как и в вопросе то можно и такое решение применить.

"""Меняю каждый символ строки на знак звёздочка"""


def change_each_symbol_line_to_sign_asterisk(input_line):
    return "*" * len(input_line)


def main():
    input_line = input("Enter line: ")
    print(change_each_symbol_line_to_sign_asterisk(input_line))


if __name__ == "__main__":
    main()
→ Ссылка
Автор решения: Runneso

Сделаем из строки список, чтобы мы могли менять элементы по индексу (в Python ,в отличии от других языков менять элементы строки по индексу невозможно). Дальше пробежимся и, используя строковой метод isalpha() будем проверять, является ли элемент списка буквой, если да, то заменим его на '*'. В конце объединим список в строку с помощью строкового метода join и вернём это строку.

def replace_letters(string: str) -> str:
    string = list(string)
    for index in range(len(string)):
        if string[index].isalpha():
            string[index] = "*"
    string = "".join(string)
    return string
→ Ссылка