簡體   English   中英

一起打印函數調用函數

[英]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將局部變量(參數為局部變量) num6
    • 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)在完成其工作之前需要ab的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM