三元运算子python中的星号表达式

时间:2019-01-10 22:07:19

标签: python python-3.x expression

我编写了一个python程序,以字符串形式最多打印每3个数字的ascii值;如果长度不能被3整除,则打印"ERROR"。当我遇到SyntaxError时,我正在打高尔夫球。

代码:

c=input()
p=len(c)
c=[int(c[i:i+3])for i in range(0,len(c),3)]
print("ERROR"if p%3else*map(chr,c),sep='')#SyntaxError here

但这可行:

c=input()
p=len(c)
c=[int(c[i:i+3])for i in range(0,len(c),3)]
print(*map(chr,c),sep='')

*之前或3之后放置空格不起作用。我可以只使用''.join,但要长一个字符。我的问题是为什么我不能在三元运算符中使用加星号的表达式?

2 个答案:

答案 0 :(得分:1)

print(*(["ERROR"] if p%3 else map(chr,c)),sep="!")

将其保留在三元组之外

答案 1 :(得分:1)

因为*必须应用于产生参数集的整个表达式,而不是参数的一部分,并且没有条件。在内部,CPython使用不同的字节码进行拆包与普通调用的调用,因此您的条件要求它根据print的参数更改字节码以调用print,实质上是重写您写入的内容伪代码,如:

if p % 3:
    call(print, "ERROR", sep='')
else:
    call_varargs(print, *map(chr, c), sep='')

这超出了编译器的能力。

如果您想完成这项工作,可以执行以下操作:

print(*(("ERROR",) if p%3 else map(chr,c)), sep='')

确保整个三元计算结果为不可打包的序列,并对无条件生存的所有内容进行打包,避免混淆。