关于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。
通过整理以上的思路,我们就可以很容易的分析出本题的正确答案是“报错”。
在这里就不继续分析啦。