我编写了一个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
,但要长一个字符。我的问题是为什么我不能在三元运算符中使用加星号的表达式?
答案 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='')
确保整个三元计算结果为不可打包的序列,并对无条件生存的所有内容进行打包,避免混淆。