2015-08-28 70 views
0

编写一个非常简单的函数来屏蔽除“#”字符以外的所有字符串的最后4位数字。这是我到目前为止有:Python三元无效语法

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)也不会改变任何东西。

+4

你不能在条件表达式'return'声明 – jonrsharpe

+0

你可以,但是,'返回X,如果COND其他y'如果你自己看着办了解如何重写你的功能。 –

+0

你期望'return'在那里做什么? 'return'不是一个表达式,不能成为其他表达式的一部分。 –

回答

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测试。

+0

谢谢,如果字符串长度小于4个字符,我不知道该切片是否可以正常工作。 – jktstance

+0

@jktstance:切片总是产生相同类型的对象,这意味着你不能出界,只会产生一个空的结果。 –

+0

仔细一看,似乎是一个三元运算符需要其他的,所以这就是为什么重写上述排除其他的也是失败的原因。三元组应用于作业的右侧,而不是整个'res =“#”*(len(cc)-4)'短语。这是有道理的,因为如果len(cc)<= 4',其他的缺失意味着资源未知。 感谢您的帮助! – jktstance

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