- 算法零基础一本通(Python版)
- 洪锦魁
- 590字
- 2022-07-29 15:07:53
5-4 函数调用与栈运作
计算机语言在执行函数调用时,内部其实是使用栈在运作,下列将以实例做说明。
程序实例ch5_4.py:由函数调用了解程序语言的运作。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_51207.jpg?sign=1739547010-ldSTb13jTPvWSZXeBAnW4v4vbOmXLQns-0-e227e224fbe3a268a88ce72529a7fe48)
执行结果
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_49965.jpg?sign=1739547010-Q4LzOgj1V76EZYza5NXF67PbEnjhkujf-0-d06af8bc3534dc93c1a3b12944feb22e)
上述是一个简单的调用函数程序,接下来我们看这个程序如何应用栈运作。程序第14行调用welcome( )时,计算机内部会以栈方式配置一个内存空间。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_49966.jpg?sign=1739547010-Kwbjsm1wLnhEBVrkexHZh9Dnlumyp3sp-0-4d03906dccda478abd42b44d6dbc93de)
当有函数调用时,计算机会将调用的函数名称与所有相关的变量存储在内存内,然后进入welcome( )函数。当执行第9行时会输出“洪锦魁 欢迎进入明志科技大学系统”。当执行第10行时调用system( ),计算机内部会以栈方式配置一个内存空间,同时堆放在前一次调用的welcome( )内存上方。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P70_49967.jpg?sign=1739547010-k3STZVGj3ty2wFP355Sur83UG1mCfoG3-0-0934248cfd8c159030e19d92a0d730e2)
程序接着执行第6行,输出“洪锦魁 欢迎进入校友会系统”,然后system( )函数执行结束,此时程序返回welcome( )函数,同时将上方的内存移除,回到welcome( )函数。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P71_49968.jpg?sign=1739547010-zPCFgqkdSMNFs3pmpOmROmO0684Hty2k-0-50630528355c8d5ae3cecd3df5524a17)
上图有一个很重要的概念是,welcome( )函数执行一半时,工作先暂停但是内存数据仍然保留,先去执行另一个函数system( )。当system( )工作结束时,可以回到welcome( )函数先前暂停的位置继续往下执行。接着执行第11行输出“使用明志科技大学系统很棒”。然后执行第12行调用bye( )函数,这个调用没有传递变量,栈内存如下所示:
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P71_49969.jpg?sign=1739547010-QSMJM3gbJfX4I4xs1ZobXRzEMnyrqO5c-0-23ba6ee75cd6842d8db6956fb29f73be)
系统会将bye( )函数新增在栈上方,然后执行第3行输出“下回见!”,接着bye( )函数执行结束。此时程序返回welcome( )函数,同时将上方的内存移除,回到welcome( )函数。
![](https://epubservercos.yuewen.com/6BDBC6/23721658309542706/epubprivate/OEBPS/Images/Figure-P71_49970.jpg?sign=1739547010-9yFbbABeGWfx2EwMnK0Vdzmwdv6TztBW-0-2c98b84843f1fbea66423ab017d6e61d)
从调用bye( )到返回welcome( )函数后,由于welcome( )函数也执行结束,所以整个程序就算执行结束了。