一元运算符应用于三元运算符自变量的用法(例如,* operator自变量应用于字符串) - python

这是我在做什么:

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

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

python大神给出的解决方案

您已经找到了在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