Python 三元语法无效

Python ternary invalid syntax

编写一个非常简单的函数,用“#”字符屏蔽除最后 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"))

如果我将 ifs 写成语句,而不是将它们用作三元运算符,则该函数可以正常工作。如果我尝试执行上述操作,我会在 res = "#" * (len(cc) - 4) if len(cc) > 4 else return cc 上收到无效语法错误 The carat is pointing to the n in return。如果我重写上面的行以排除 else 部分,则克拉指向 > 4.

我在这里错过了什么?该程序使用传统的 if-else 方法运行良好,但对于三元,我所看到的只是一个表达式。用变量替换 len(cc) 也不会改变任何东西。

这里根本不需要三元表达式,只需要分片,用长度减去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'

您的语法错误源于您在表达式中使用了 returnreturn 是一个 语句 ,不能在表达式中使用语句。语句有适合表达式的地方,而不是相反。

如果在满足条件时需要 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