Решение зависит от позиции
При обходе строки индекс позволяет выбирать действие для каждого символа. В этом упражнении граница видимой части зависит от общей длины: последние четыре позиции сохраняются, остальные заменяются звёздочкой.
Задание источника
Реализуйте mask_card_number для учебной строки номера:
def mask_card_number(card_number: str) -> str:
result = ""
i = 0
visible_part_start = len(card_number) - 4
while i < len(card_number):
if i < visible_part_start:
result += "*"
else:
result += card_number[i]
i += 1
return result
Примеры
Для "1234567812345678" результат "************5678": двенадцать скрытых и четыре видимых символа. Для "12345678" получаем "****5678".
Длина результата совпадает с длиной входа. Это отличается от ранее изученной get_hidden_card, где число звёздочек задавалось отдельно и не обязано было совпадать с длиной скрытой части. Здесь другое правило результата и другой учебный алгоритм — посимвольный обход.
Границы
Строка из четырёх символов остаётся целиком видимой. При меньшей длине visible_part_start отрицателен, и все существующие индексы попадают в видимую часть. Пустая строка возвращается пустой. Если приложение должно запрещать короткие номера, нужна отдельная проверка.
Не безопасность хранения
Функция создаёт маску для отображения. Исходный номер не удаляется из памяти, не шифруется и не становится безопасным для записи в журнал. Для обучения используйте вымышленные последовательности, не реальные платёжные данные.
Условие цикла i < len(card_number) не включает индекс длины, поскольку такой позиции в строке нет. Увеличение i выполняется после обеих ветвей, иначе возможна остановка продвижения.
Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Правило сохранения длины сохранено; пределы маскировки указаны.