![算法零基础一本通(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/51/44510051/b_44510051.jpg)
上QQ阅读APP看书,第一时间看更新
5-4 函数调用与栈运作
计算机语言在执行函数调用时,内部其实是使用栈在运作,下列将以实例做说明。
程序实例ch5_4.py:由函数调用了解程序语言的运作。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_51207.jpg?sign=1739197745-u4iwknQnnorcmKqhj1utH4fiWLt9X97u-0-3b89dee53ee4ef02527911372b0989a6)
执行结果
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_49965.jpg?sign=1739197745-weyHctYd5gPJYFO30hx5J5oj95F3lMsT-0-c64367c1d9f6f54690ce4962134d66c9)
上述是一个简单的调用函数程序,接下来我们看这个程序如何应用栈运作。程序第14行调用welcome( )时,计算机内部会以栈方式配置一个内存空间。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_49966.jpg?sign=1739197745-9hun5qUotcPFehLBwtIzKiKKauyH6Q6Z-0-64366a0cc15344510859eccef7849156)
当有函数调用时,计算机会将调用的函数名称与所有相关的变量存储在内存内,然后进入welcome( )函数。当执行第9行时会输出“洪锦魁 欢迎进入明志科技大学系统”。当执行第10行时调用system( ),计算机内部会以栈方式配置一个内存空间,同时堆放在前一次调用的welcome( )内存上方。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_49967.jpg?sign=1739197745-TloU6wziNaEVMMpkniBbg6hP3xcOYgPU-0-2defa3413b55f8e7ceba455ef34beaba)
程序接着执行第6行,输出“洪锦魁 欢迎进入校友会系统”,然后system( )函数执行结束,此时程序返回welcome( )函数,同时将上方的内存移除,回到welcome( )函数。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P71_49968.jpg?sign=1739197745-lYAgt2UtFB2kkf42esLXCwD53hYstlF9-0-b10e6aad5c8fd0cdde91cd921b64a869)
上图有一个很重要的概念是,welcome( )函数执行一半时,工作先暂停但是内存数据仍然保留,先去执行另一个函数system( )。当system( )工作结束时,可以回到welcome( )函数先前暂停的位置继续往下执行。接着执行第11行输出“使用明志科技大学系统很棒”。然后执行第12行调用bye( )函数,这个调用没有传递变量,栈内存如下所示:
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P71_49969.jpg?sign=1739197745-9XnsJBB8wEzjEITYyLhlJZaBpdI6wNbl-0-6c3216e5488aa03b2623ab1ddfdae70e)
系统会将bye( )函数新增在栈上方,然后执行第3行输出“下回见!”,接着bye( )函数执行结束。此时程序返回welcome( )函数,同时将上方的内存移除,回到welcome( )函数。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P71_49970.jpg?sign=1739197745-W6vwWbZWXF4e8bqResCGdI3W9Gcj1iFY-0-22a7b72cb5c89724f24dbf4793272826)
从调用bye( )到返回welcome( )函数后,由于welcome( )函数也执行结束,所以整个程序就算执行结束了。