![](/img/trans.png)
[英]Kernel restarts when calling self defined function which adds together lambda functions
[英]Print function calling functions together
我正在測試某些東西,並且出於示例目的編寫了這段代碼。我覺得我得到的輸出很奇怪。我期望函數調用是一個接一個地執行的,但是根據這個代碼,兩個print語句都在彼此之后執行,並且然后將返回值打印在一起。這意味着什么?在這種情況下,代碼的流程是什么?
global num
num=5
def demo(num):
num+=1
print("hi")
return(num)
print(demo(num),demo(num))
輸出-
hi
hi
6 6
我期望函數調用一個接一個地執行
就是這樣。
但有沒有辦法讓print
可以在發生之前demo
,因為它試圖打印出這些調用返回的值調用。 (您可以寬松地將其視為在任何有括號的位置的特殊情況: 2 * (3+4)
在乘以3+4
之前不能乘以2
,並且print(demo(num), demo(num))
不能打印的結果demo(num)
和demo(num)
直到它被稱為他們,但不要采取文生義。)
因此,這些demo
調用從左到右發生,然后進行print
調用。
更詳細地講,讓我們逐步介紹如何評估這條線:
print(demo(num),demo(num))
…Python必須這樣做:
print
,該內置名稱會找到內置print
功能。 demo
,該全局名稱會找到您定義的全局demo
功能。 num
查找為全局名稱來評估num
,以找到全局5
值。 num
獲取傳入的值5
。 num += 1
將局部變量(參數為局部變量) num
為6
。 print("hi")
打印出hi
。 return(num)
返回局部變量6
的值。 hi
並返回6
。 print
來調用返回的函數,因此它將輸出6 6
。 如果需要嚴格的定義,請參閱參考文檔中“ 呼叫”中的詳細信息。 特別是(去除無關位)
call ::= primary "(" [argument_list] ")"
…
主要對象必須評估為可調用對象……。 在嘗試調用之前,將評估所有參數表達式。
根據此代碼,兩個打印語句都彼此執行,然后將返回值一起打印
是。 必須依次執行兩個函數調用,以便它可以獲取值以傳遞給print
函數。 執行它們會輸出兩次“ Hi
。 然后,它具有所有值,因此可以print
它們,由於兩個值均為6
,因此將打印出6 6
6
。
程序評估與算術一樣具有操作順序。 同樣,它也不總是很直觀,尤其是當我們在閱讀時從左到右,從上到下“消耗”東西時。
那么,有什么用呢? 讓我們成為python解釋器,看看為什么操作順序很重要。
# A wild statement appears. Time to compute!
print(demo(num),demo(num))
# I cant't print yet! i'm missing info!
我需要評估這第一個demo(num)
,默認情況下,我將在一個遠離全局變量的封閉空間內進行操作
# evaluating demo(num=5) - num here is a new local variable, it has no relation to the global one defined above
num+=1 # num = 6
print("hi") # [[[PRINT hi]]] ~> to console
return 6 # returns the value 6 filling in another piece of the puzzle
我們現在在哪里? 幾乎可以調用此打印了,只需要再次執行此演示操作
print(6, demo(num))
# What is num though?
# Well, the only num I know of out here in global space is 5
print(6, demo(5))
# evaluate: demo(5)
這似乎很熟悉!
# evaluating: demo(num=5) - again, a NEW local variable is created just for this function call
num+=1 # num = 6
print("hi") # [[[PRINT hi]]] ~> to console
return 6
最后,print具有它需要的所有參數
print(6, 6) # [[[PRINT 6 6]]] ~> to console
print
不是魔術,它只是另一個功能! 與您編寫的demo
相同。
在提供所有參數之前,函數不會求值。
print(a, b)
在完成其工作之前需要a
& b
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.