python函數應該先定義後調用

關於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。
通過整理以上的思路,我們就可以很容易的分析出本題的正確答案是“報錯”。
在這裏就不繼續分析啦。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章