Необходимо написать функцию, заменяющую все символы(кроме последних четырех) на знак решетки "#"

Проблема заключается в том, что поставленная задача выполняется не корректно. То есть заменяются всего пара букв во всём предложении. При чём я не совсем понимаю с чем это связано, т.к. при изменении среза, меняются разные буквы.

Подскажите, пожалуйста, где допускается ошибка в логике?

def maskify(cc):
    for i in cc[:-4]:
        arr = cc.replace(i, '#')
        
    cc = ''.join(arr)
    return cc


password = 'Hello everyone' 
maskify(password)

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

Автор решения: Dmitry

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

def maskify(cc):
  grid_len = len(cc) - 4
  return "#" * grid_len + cc[-4:]

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

>>> maskify("Hello WORLD")
'#######ORLD'
>>> maskify("Hello everyone")
'##########yone'

Напишите только обработку на строку меньше четырех символов

→ Ссылка
Автор решения: Эникейщик

Ошибки в логике здесь:

for i in cc[:-4]:
    arr = cc.replace(i, '#')

При каждой итерации arr затирается новым значением и в самом конце заменена только пятая с конца буква (и все остальные такие же). Добавь print(arr) и поймёшь, что именно происходит.

for i in cc[:-4]:
    arr = cc.replace(i, '#')
    print(arr)

И вообще привыкай выводить на печать значения переменных, когда ищешь ошибки.

→ Ссылка