这是我在做什么:
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
。