Троичный неверный синтаксис 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