Python三元无效语法

时间:2015-08-28 15:06:44

标签: python ternary-operator

编写一个非常简单的函数来屏蔽除“#”字符的字符串的最后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)也不会改变任何东西。

2 个答案:

答案 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'

您的语法错误源于您在表达式中使用returnreturn语句,您不能在表达式中使用语句。语句包含表达式适合的位置,而不是相反。

如果您需要在满足条件时返回,则除了使用语句(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