Можно так, в принципе:
def compose(f, g, h): return lambda *args, **kwargs: f(g(h(*args, **kwargs)))
print(max(filter(compose((1).__eq__, (10).__rmod__, abs), map(int, iter(input, '0'))), default = 'Нет чисел, оканчивающихся на 1'))
Но если "слооооожно", то так:
print(max((n for n in map(int, iter(input, '0')) if abs(n) % 10 == 1), default = 'Нет чисел, оканчивающихся на 1'))
Это Питон на минималках.
А решать данную задачу циклом while - это уже не Питон, а Паскаль. Ладно, раз старика Блеза в честь Пасхи назвали, приведу и этот вариант:
m = 0
while (n := int(input())) != 0:
if abs(n) % 10 == 1 and (n > m or m == 0): m = n
print(m if m else 'Нет чисел, оканчивающихся на 1')
Обращаем внимание, что числа -31, -1551 и т.п., тоже оканчиваются на 1, но дают остаток 9, а не 1, при делении на 10. Поэтому делим абсолютную величину. И конечно, максимум может быть отрицательным, если все числа, оканчивающиеся на 1, были отрицательными.
Примеры.
Входные данные:
-31
-9
4
8
-181
0
Выходные данные:
-31
Входные данные:
54
42
0
Выходные данные:
Нет чисел, оканчивающихся на 1