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'
您的语法错误源于您在表达式中使用了 return
。 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
编写一个非常简单的函数,用“#”字符屏蔽除最后 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'
您的语法错误源于您在表达式中使用了 return
。 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