编写一个非常简单的函数来屏蔽除“#”字符的字符串的最后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
上收到无效的语法错误。克拉指向n作为回报。如果我重写上面的行以排除else部分,那么克拉指向> 4。
我在这里缺少什么?该程序使用传统的if-else方法工作正常,但是我所看到的三元数是一个表达式。用变量替换len(cc)也不会改变任何东西。
答案 0 :(得分:3)
这里根本不需要三元表达式,只需切片并使用长度减去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
测试。
答案 1 :(得分:1)
以下解决方案假设这将使用安全类型,因为这样的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