B1 · 第24集 · 4:43
Python函数调用流程
本集讲解Python中函数调用的执行顺序和返回值替换过程。
来源:jmbarbier / peertube.solidev.net · 许可:CC BY-SA 4.0
字幕
Donc je reviens à mon programme à plan, et cette fois la fonction f,
因此,我回到我的主程序,这次函数 f
pareil, n'existe plus, et l'ensemble de ce que j'avais là.
同样已不存在,而我之前写下的所有内容
est remplacé par la valeur de retour qui vaut douze.
都被返回值 12 替代了。
Puis dernier appel, cette fois je réappelle ma fonction g.
接着是最后一次调用,这次我再次调用函数 g。
Avec le paramètre 12, donc c'est à nouveau un appel.
参数为 12,所以这又是一次函数调用。
le paramètre a vaut 12,
此时参数 a 的值为 12,
et je vais renvoyer trois fois cette valeur.
我将返回该值的三倍。
Donc je reviens dans mon programme principal
然后我回到主程序,
en renvoyant 36 points.
并返回结果 36。
Donc retour programme principal,
回到主程序后,
et cette fois, toute cette partie- là
这一次,这部分代码
est remplacée par la valeur de retour.
被返回值所替代。
Donc là ici 36, ce qui me fait que à la fin.
也就是这里的 36,最终使得
J'ai un print 36 et un magnifique écran sur lequel s'affichera juste le nombre
程序执行 print(36),屏幕上将显示一个非常漂亮的数字
36. On peut aller vérifier en Python.
36。我们可以在 Python 中验证一下。
36. Et si on fait l'exécution,
36。如果运行程序,
on va retrouver le même ordre d'exécution que ce qu'on a fait.
会发现执行顺序与我们刚才分析的一致。
déclaration appel de g,
先声明并调用函数 g,
ressort de g. Puis appel de f, on est là,
g 执行完毕返回;接着调用函数 f,我们来到此处,
puis on ressort, puis on appelle le g.
f 返回后,再次调用函数 g。
Et on ressort et on fait l'affichage print.
g 再次返回,最后执行 print 输出。
si vous voulez garder l'historique des différentes fonctions qui ont été appelées,
如果你想保留所有被调用函数的历史记录,
quand vous êtes dans Python Tutor, vous pouvez, quand vous écrivez ici le code,
在 Python Tutor 中编写代码时,
lui dire de montre et toutes les show all frames ici,
可以点击这里设置‘显示所有帧’,
ça va garder tous les appels passés, tous les appels passés
这样它就会保留所有过往的函数调用,
des fonctions, ne pas les
即所有已调用过的函数,
effacer une fois que la fonction est terminée.
而不会在函数执行完毕后将其清除。
Donc là, si je reprends celui- là, avec la même manière.
所以现在,如果我重新使用这个,用同样的方法。
Voilà, vous voyez que ici en fait il garde en fait simplement l'historique de tout
看,您会发现这里实际上只保留了所有操作的历史记录,
ce qui s'est passé, visuellement ça permet de garder,
从视觉上看,这让我们能
de revenir un peu dans le passé en arrière.
稍微回到过去。
Je le fais pas parce que ça prend plus de place,
我不这么做,是因为它会占用更多空间,
mais ça peut être pratique de le faire.
但有时这样做会很实用。
Et on revient sur l'exercice suivant.
接下来我们回到下一道练习题。
Alors exercice 5, les choses se compliquent
练习5来了,情况变得更复杂了。
encore. On a des fonctions qui appellent des fonctions dans des fonctions.
我们遇到了函数调用函数、再调用函数的情况。
à vous de jouer, il y en a pour un certain temps et je pense que vous pouvez ne pas
请你们自己尝试解答——这需要花些时间;
faire éventuellement l'exercice 6 qui est encore peut- être plus compliqué.
你们甚至可以暂时跳过可能更难的练习6。
On va voir. Si vous avez le temps, faites le 6, mais il est vraiment
我们稍后再看。如果时间允许,请做第6题,但它真的
costaud. A few moments later.
很难。稍后见。
Alors, correction pour l'exercice cinq.
下面,我们来讲解练习5的答案。
On a trois fonctions qui sont définies.
我们定义了三个函数。
Donc mon programme avance et ne démarre qu'en fait ici.
我的程序是逐步运行的,实际从这里才开始执行。
Tout ça, c'est de la déclaration de fonction, ça ne fait rien.
这些全是函数声明,不会执行任何操作。
Le programme commence par un appel, mon programme principal,
程序首先发起一个调用:这是主程序,
je suis là, il commence par un appel.
我在这里,它以一次调用为起点。
avec W de 1. Donc je passe
传入参数W等于1。因此我将
A W et non pas.
W值传入,而不是其他参数。
Et w va faire un print de tout ça.
接着W会打印出全部内容。
Donc je passe de la fonction principale à la fonction w.
因此,我从主函数跳转到了函数W。
Et la variable a vaut
此时变量a的值是
un. Ensuite à l'intérieur de w, je vois que j'ai un h
1。然后在W内部,我看到有h(a)的调用,
de a, donc je vais sauter à
所以我将跳转到
l'exécution de h de a.
h(a)的执行处。
A ici, c'est un appel avec
这里,这是一个调用
la fonction h.
函数 h 的调用。
Je fournis l'argument a ici qui vaut 1, donc là ma fonction h,
我传入参数 a,其值为 1,因此此时函数 h
elle récupère un a qui vaut 1.
获取到的 a 值就是 1。
Et elle va elle- même
接着,它自身会
faire un appel à la fonction g de a.
调用函数 g,并传入 a。
A vaut 1, donc j'ai un appel ici à la fonction g.
a 的值是 1,因此这里就调用了函数 g,
avec un a qui vaut 1.
传入的 a 值也是 1。
Cette fonction g, elle
这个函数 g 会
affiche la valeur de a.
打印出 a 的值。
Donc là, je peux faire mon écran.
所以现在,我可以运行这段代码了。
Et là, ici, j'ai donc un print a et a vaut 1.
这里屏幕上会显示:print a,而 a 的值是 1。