应用于三元运算符参数的一元运算符的使用(例如,应用于字符串的*运算符参数)

时间:2014-12-05 20:07:45

标签: python python-3.x ternary-operator

这是我正在做的事情:

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

否定-运算符不适用于整个三元语句,而*运算符则不适用。为什么? *运算符有什么特别之处?

2 个答案:

答案 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