2014-12-05 24 views
2

下面是我在做什麼:使用適用於三元操作參數(例如,*操作參數應用到字符串)

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

你已經找到了正確的方式寫在your own answer代碼:

def func(a,b=1,*args): 
    print('a:',a,'b:',b,'args:',*args if args else ['No args']) 

但是,沒有按」 t回答你「關於*運營商的特別之處」的問題。

首先要注意的是,*實際上並不是運營商,它是function call syntax的一部分。但是在鬆散的對話中(包括實際的文檔),它通常被稱爲「摔跤運營商」,所以這不是一個很好的答案。 (對於conditional expressions也是如此,它們也不是運算符表達式,但它仍經常被稱爲「三元運算符」或「if-else運算符」。)

但是,更重要的是,如果要將*… if … else …(鬆散地)視爲運營商,您必須考慮運營商優先權。三元運算符只是綁定比splat運算符更緊密,而它不會比否定運算符更緊密。

所以,這就像是在寫2/3 * 52 - 3 * 5時問「/運營商有什麼特別之處」。 -適用於整個3 * 5,但/僅適用於3,因爲運算符優先。

+0

謝謝你對你的回答非常友善和解釋,基本上(和正確的):「它只是。」 ;) – 2014-12-05 20:28:26

+0

@RickTeachey:在某種程度上,任何語言的運算符優先級規則都是任意的。但實際上,語言設計者試圖提出優先規則,這會使事情更頻繁地更易讀。 (Python的設計者還增加了一個額外的約束,試圖使優先規則變得簡單和簡約,所以當它不明顯時,它至少容易記住。) – abarnert 2014-12-05 20:32:08

+0

這很好。 – 2014-12-05 20:33:23

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 
+4

我懷疑有比這更清潔的方式。星號[適用於整個參數](https://docs.python.org/3/reference/expressions.html#grammar-token-argument_list),所以你不能只寫''(* args)之類的東西if ARGS ...'。 – Kevin 2014-12-05 20:11:20