關於python第十一套試題中第26題選擇題。
題目如下:
def fun1():
print("in fun1()")
fun2()
fun1()
def fun2():
print("in fun2()")
fun1()
fun2()
我看到這一題時第一印象就選擇了“死循環”,但是事實卻恰恰相反,正確答案是“報錯”。
那麼就來找一下原因吧。
def fun1():
print("in fun1()")
fun1()
當我們執行這個代碼時,毫無疑問可以正常輸出。讓我們在看一下下面這個代碼的執行。
fun1()
def fun1():
print("in fun1()")
我們將定義和調用的順序顛倒了。這是我們再執行就會報錯。
(NameError: name 'fun1' is not defined)
這個我們應該比較好理解,應爲我們並沒有去定義一個名爲fun1的函數,所以我們無法調用。
那麼讓我們再深入一下。
def fun1():
fun2()
def fun2():
print("in fun2()")
print("hello")
fun1()
以上這個代碼爲什麼可以正常執行呢?它在fun1函數的時候又不知道有fun2函數,它爲什麼不
報錯呢? 這是因爲python執行時,它只去讀取函數名,但是不沒有進入函數內部,所以
它並不瞭解函數的內部執行的到底是啥。當我們在最後調用fun1時它纔會進入,然後發現要執行
fun2函數,這時候它已經知道有一個函數叫fun2的,所以他就可以執行。
def fun1():
fun2()
print("hello")
fun1()
def fun2():
print("in fun2()")
以上這個代碼,您應該猜到它會報錯啦。這我們用上面的思路有驗證一下。
執行代碼,程序知道了一個叫fun1的函數,然後打印輸出“hello”,碰到調用fun1函數,
進入函數內部,原來要調用名爲fun2的函數,但是我們沒有見過它啊,所以就會報出錯誤。
NameError: name 'fun2' is not defined。
通過整理以上的思路,我們就可以很容易的分析出本題的正確答案是“報錯”。
在這裏就不繼續分析啦。