这是我正在做的事情:
def func(a,b=1,*args):
print('a:',a,'b:',b,'args:',*args if args else 'No args')
func(1,2)
这就是我的预期:
#a:1 b: 2 args: No args
这是我实际得到的:
#a:1 b: 2 args: N o a r g s
*
运算符正在解压缩'No args'
字符串。所以这就是我应该做的事情:
#Produces expected result:
def func(a,b=1,*args):
print('a:',a,'b:',b,'args:',*args if args else ['No args'])
因此*
运算符应用于整个三元语句。但-
运算符似乎没有发生这种情况:
def func(a,b=1,*args):
print('a:',a,'b:',b,'negative args[0]:', -args[0] if args else 1000000)
func(1,2)
#expected result:
#a:1 b: 2 negative args[0]: -1000000
#actual result:
#a:1 b: 2 negative args[0]: 1000000
否定-
运算符不适用于整个三元语句,而*
运算符则不适用。为什么? *
运算符有什么特别之处?
答案 0 :(得分:3)
"运营商优先,虚拟。"
def func(a,b=1,*args):
print('a:',a,'b:',b,'args:',*args if args else ['No args'])
func(1,2)
按预期结果:
#a: 1 b: 2 args: No args
答案 1 :(得分:2)
您已经找到了在your own answer中编写代码的正确方法:
def func(a,b=1,*args):
print('a:',a,'b:',b,'args:',*args if args else ['No args'])
但这并没有回答你关于“*
运营商的特殊情况”的问题。
首先要注意的是*
实际上根本不是运算符,它是function call syntax的一部分。但是在松散的对话中(包括在实际文档中),它通常被称为“splat运算符”,所以这不是一个很好的答案。 (对于conditional expressions也是如此,它也不是运算符表达式,但它仍然经常被称为“三元运算符”或“if-else运算符”。)
但更重要的是,如果您希望将*
和… if … else …
(松散地)视为运算符,则必须考虑运算符优先级。三元运算符比splat运算符绑定得更紧密,而它的绑定不比否定运算符更紧密。
因此,当您撰写/
和2 / 3 * 5
时,就像问“2 - 3 * 5
运算符的特殊之处”一样。 -
适用于整个3 * 5
,但由于运营商优先权,/
仅适用于3
。