Троичный неверный синтаксис Python

Написание очень простой функции для маскировки всех, кроме последних 4 цифр строки, с символами "#". Это то, что я до сих пор:

def maskify(cc):
    res = "#" * (len(cc) - 4) if len(cc) > 4 else return cc
    res += cc[len(cc) - 4:]
    return res    

print(maskify("12355644"))

Если я выписываю операторы if как операторы, вместо того, чтобы использовать их как троичные операторы, функция работает нормально. Если я пытаюсь сделать выше, я получаю неверную синтаксическую ошибку на res = "#" * (len(cc) - 4) if len(cc) > 4 else return cc Карат указывает на n взамен. Если я перепишу вышеприведенную строку, чтобы исключить остальную часть, то карат указывает на> 4.

Что мне здесь не хватает? Программа работает нормально, используя традиционный метод if-else, но с троичным я вижу только выражение. Замена len(cc) переменной тоже ничего не меняет.

2 ответа

Решение

Вам не нужно троичное выражение здесь, просто нарежьте и используйте длину минус 4 раза "#' сгенерировать префикс:

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

Если len(cc) - 4 значение равно 0 или меньше, умножение дает пустую строку.

Демо-версия:

>>> def maskify(cc):
...     return "#" * (len(cc) - 4) + cc[-4:]
... 
>>> maskify("12355644")
'####5644'
>>> maskify("355644")
'##5644'
>>> maskify("5644")
'5644'
>>> maskify("44")
'44'

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

Если вам нужно вернуться, когда условие выполнено, у вас нет выбора, кроме как использовать операторы (if с последующим return):

if len(cc) < 4:
    return cc
res = "#" * (len(cc) - 4) 
res += cc[-4:]
return res

но if тест на самом деле не нужен.

Следующее решение предполагает, что это будет использовать тип безопасности, поскольку такие строки из 4 или менее символов должны быть просто хэшированы, в противном случае кто-то будет знать всю строку.

import string

def maskify(cc):
    if len(cc) < 9:
        split = [0,1,2,3,4,4,4,4,4][len(cc)]
    else:
        split = len(cc) - 4

    return "#" * split + cc[split:]

for length in range(1,12):
    test = string.ascii_lowercase[:length]
    print("%s > %s" % (test, maskify(test)))

Давать следующие результаты:

a > #
ab > ##
abc > ###
abcd > ####
abcde > ####e
abcdef > ####ef
abcdefg > ####efg
abcdefgh > ####efgh
abcdefghi > #####fghi
abcdefghij > ######ghij
abcdefghijk > #######hijk
Другие вопросы по тегам