2016-05-16 54 views
3

我想了解Python中的多個函數調用,但有點困惑。多個函數調用如何在Python 2.7

例如,如果有兩個分別名爲WorkPlay字符串變量,我寫了多個函數調用,如:

Work.find(Play.strip().split()[0]) 

這是否使用播放的意思是像

  1. 呼叫的方法帶,
  2. 使用上述1的結果調用方法拆分,
  3. 從上面2的結果中提取第一個元素,
  4. 調用方法查找使用3以上的結果。

還是意味着

  1. 呼叫的方法使用上述工作分開。
  2. 使用上面1的結果調用方法條。
  3. 從上面的結果2中提取第一個元素。
  4. 調用方法查找使用上面3的結果。

還是Python執行call()函數,因爲它們被寫入?

感謝您的幫助

回答

4

在Play上調用strip()時,將調用split(),並將第一個從split調用返回的值作爲參數傳遞給Work上的find()調用。
將圓括號中的內容看作傳遞給find()調用的表達式。我們可以擴展這個代碼:

Work.find(Play.strip().split()[0]) 

爲:

strip_result = Play.strip() 
split_result = strip_result.split() 
argu = split_result[0] 
Work.find(argu) 

第一個代碼位是很多更加緊湊,但第二個更具可讀性。你應該檢查PEP 8和你自己的偏好來決定使用哪一個。

+0

非常感謝你 – lufee

1

這是否使用結果使用播放,2.Call到方法分割的意思是像1.Call到帶材的方法從上述1 3.Extracts第一元件從2以上的結果,4。調用方法從3以上找到使用結果。

1

如果您有多個函數調用,那麼您應該從左到右讀取它們,並將下一個函數調用應用到先前創建的對象。

所以從您的文章,以下是正確的:

是否使用效果使用播放,2.Call到 方法拆分這意味着像1.Call 1以上,3.Extracts第一要素,以法條來自 2以上的結果,4.調用方法從上面的3中找到使用結果。

+1

謝謝你的幫助 – lufee

0

呼叫順序是(中間變量名添加爲清楚起見):

  • Play.strip()首先被調用(x)的
  • x.split()被稱爲(Y)
  • y[0](Z)
  • Work.find(z)
+0

如果你只是做了'x = ...; y = x.split(); z = y [0]'等等? –

+0

也許!現在有足夠的答案,它沒關係太多:) –

1

此:

Work.find(Play.strip().split()[0]) 

...確實是這樣的等價物:

tmp1 = Play.strip() 
tmp2 = tmp1.split() 
tmp3 = tmp2[0] 
Work.find(tmp3) 

Python會調用該()連接到函數之前的()內執行的一切。在()內,它從左向右評估代碼。

+0

非常感謝你提供豐富的答案^^ – lufee

1

碼的方法,就像數學,遵循「做的東西,括號內第一個」漂亮的標準convension,例如,如果你這樣做:

x = sin(1+5) 

你會以爲,1+5發生第一,然後做sin(6)其中6是內部操作1+5的結果。完全相同的原理這裏:

Work.find(Play.strip().split()[0]) 

首先內表達Play.strip().split()[0]被評估,然後操作Work.find被稱爲與內表達作爲參數的結果。

又一次的內部操作從左稱爲向右很像數學,所以

Play.strip().split()[0] 

會首先做Play.strip()然後對這個結果做r.split()然後的結果做r[0](其中r是最後一部分的結果)

請注意,如果你真的想絕對difinitive答案然後dis彙編代碼:

>>> import dis 
>>> dis.dis(compile("Work.find(Play.strip().split()[0])","<example>","eval")) 
    1   0 LOAD_NAME    0 (Work) 
       3 LOAD_ATTR    1 (find) 
       6 LOAD_NAME    2 (Play) 
       9 LOAD_ATTR    3 (strip) 
      12 CALL_FUNCTION   0 (0 positional, 0 keyword pair) 
      15 LOAD_ATTR    4 (split) 
      18 CALL_FUNCTION   0 (0 positional, 0 keyword pair) 
      21 LOAD_CONST    0 (0) 
      24 BINARY_SUBSCR 
      25 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      28 RETURN_VALUE 

好吧,也許會更混亂,然後有幫助...

但是你可以看到,前兩個CALL_FUNCTION沒有參數,所以你可以扣除.strip()然後.split()被稱爲最後CALL_FUNCTION這是與一個位置呼叫是Work.Play(<expression>)

+0

非常感謝你提供豐富的答案,現在我明白了。 – lufee

相關問題