B1 · 第22集 · 4:37

Python函数作用域

本集讲解Python中函数内部变量与外部变量的隔离性,以及函数调用时参数传递和返回值的工作机制。

来源:jmbarbier / peertube.solidev.net · 许可:CC BY-SA 4.0

字幕

  1. De mon programme pour retourner vers le programme principal

    从我的函数返回到主程序

  2. et la valeur que je renvoie c'est la valeur a,

    我返回的值是变量a的值

  3. 5. Vous voyez que le a

    也就是5。您可以看到,这里的a

  4. qui est là n'a pas changé de valeur.

    它的值并没有改变。

  5. D'accord? Donc c'est ici j'ai un retour, ce a là qui était à l'intérieur,

    明白了吗?因此,这里有一个返回值:这个在函数内部的a,

  6. lui il a changé de valeur, mais il n'existait qu'à l'intérieur de la fonction.

    它的值确实改变了,但它只存在于函数内部。

  7. Là ici, j'ai un retour sortie et ça n'a pas changé les autres valeurs.

    而这里,我执行的是‘返回输出’操作,

  8. Le a n'a pas changé, le b n'a pas changé.

    其他变量的值并未因此改变:a没变,b也没变。

  9. C'est deux. ces deux variables différentes,

    这是两个不同的变量,

  10. qu'on appelait l'étanchéité en quelque sorte,

    我们称之为‘作用域隔离’,

  11. les variables qui sont définies ou utilisées dans la fonction sont étanches,

    即在函数内定义或使用的变量是隔离的,

  12. ne jouent pas sur les variables qui sont à l'extérieur.

    不会影响外部的变量。

  13. Et donc là ici, ça veut dire que quand j'arrive ici,

    因此,当执行到这里时,

  14. je reviens à ma fonction à plantes.

    我就回到了‘plantes’函数中。

  15. Et je vais remplacer la valeur de la fonction à plantes par la valeur de retour qui

    接着,我会用该函数的返回值

  16. vaut. 5. Donc là maintenant mon print il va s'exécuter,

    也就是5,来替换它。此时,我的print语句将执行,

  17. ça va me faire print 5 3 2. Mon print ici va me faire du 5.

    输出结果为‘5 3 2’;这个print语句会打印出5。

  18. 3, 2, on peut aller, et fin du programme.

    接着是3、2,程序继续运行,最后结束。

  19. On peut aller vérifier ça sur.

    我们可以去验证一下,

  20. Notre notebook.

    打开我们的笔记本。

  21. Exercice 2, on exécute.

    练习2,运行代码。

  22. 3 2, 5 3 2, c'est ce qu'on avait prévu.

    3、2,5、3、2——这正是我们预期的结果。

  23. Et on peut aller vérifier ça dans Python Tutor.

    我们还可以用Python Tutor来验证。

  24. On a la déclaration de la fonction, on fait une variable a, une variable b,

    首先声明函数,再创建变量a和变量b,

  25. donc là ils sont ici global frame, c'est le programme principal.

    它们位于全局作用域,也就是主程序中。

  26. Puis j'appelle ma fonction.

    然后我调用我的函数。

  27. Lors de l'appel de ma fonction,

    当我调用我的函数时,

  28. vous voyez que j'ai un a et un b qui sont différents du a et du b du programme

    你们会发现,这里的 a 和 b 与主程序中的 a 和 b 并不相同。

  29. principal. Donc là j'ai bien mon a et mon b qui sont des nouveaux en quelque sorte.

    所以,这里的 a 和 b 实际上是两个全新的变量。

  30. Là, quand je vais le modifier, ça changera dans celui- là,

    此时,如果我修改它,只会影响这个变量,

  31. mais pas dans celui- là. Et je vais renvoyer la valeur 5 pour afficher le print 5 3

    而不会影响那个变量。接着我会返回数值 5,从而让 print 输出 '5 3'。

  32. 2. Donc Python Tutor nous aide à faire ceci.

    因此,Python Tutor 帮助我们实现这一点。

  33. À vous de jouer pour.

    接下来轮到你们动手练习了。

  34. Exercice 3. Alors l'exercice 3.

    练习 3。那么,练习 3……

  35. Ça se complique un petit peu puisqu'on a des fonctions qui vont appeler d'autres

    难度稍有提升,因为这里涉及函数调用其他函数,

  36. fonctions. Mais finalement, le principe est exactement le même.

    但归根结底,原理完全一样。

  37. Il suffit de rester calme, de ne pas s'affoler et de bien écrire tous les détails

    只需保持冷静,不要慌乱,

  38. qu'on peut avoir.

    并把所有能想到的细节都清晰写出来。

  39. Donc je pars de là.

    我从这里开始分析。

  40. Définition de ma fonction 1,

    先定义函数 1,

  41. définition de la fonction 2, définir une fonction ça fait rien.

    再定义函数 2;定义函数本身并不会执行任何操作。

  42. Donc la première exécution réelle de programme, elle est à cet endroit- là.

    因此,程序第一次真正执行,就发生在这里。

  43. Là ici, j'ai un appel, je suis dans mon programme principal,

    此处,我有一个函数调用:此时我处于主程序中,

  44. et j'ai un appel à la fonction couicouic.

    并调用了函数 couicouic。

  45. Avec ici un seul paramètre qui est le paramètre qui vaut 3.

    它接收一个参数,值为 3。

  46. Donc le par position, le paramètre en première position de quick qui vaut 3.

    也就是说,按位置传参,quick 的第一个参数值为 3。

  47. Donc ça nous fait ici un c égale 3.

    于是,这里得到 c 等于 3。

  48. Et je vais renvoyer c.

    接着我将返回 c 的值。

  49. Pardon. Je passe à la fonction cucu,

    抱歉,我转到函数 cucu,

  50. et ensuite j'ai un appel ici à la fonction c égale coucou de c.

    随后这里又调用函数 c égale coucou,并传入参数 c。

  51. Donc, la fonction coucou elle est là- haut,

    因此,coucou 函数位于上方,

  52. je vais aller sauter à exécuter cette fonction.

    我将跳转过去执行该函数。

  53. Ça veut dire que je pars de là

    这意味着我从这里出发,

  54. et je vais exécuter coucou.

    去执行 coucou 函数。

  55. Avec quoi est- ce que je vais exécuter coucou?

    我将用什么来执行 coucou 呢?

  56. J'ai ici un seul argument qui a été donné, qui est l'argument c,

    这里我只有一个传入的参数,即参数 c,

  57. la valeur c. Je peux voir ici sa valeur, c'est 3.

    也就是值 c;我能看到它的值是 3。

  58. Donc là ici, j'ai un appel avec une fonction,

    此时,这里是一个函数调用,

  59. l'appel ici à ce moment- là c'est 3. Donc quand j'arrive sur coucou,

    此刻传入的实参是 3。因此当我进入 coucou 函数时,

  60. je n'ai donné des arguments que par position, cet argument- là vaut 3.

    我仅按位置传入了参数,这个参数的值就是 3。

  61. Donc ici, ça me fait a

    于是这里令 a 等于

  62. égal 3 et puis b n'a pas été donné, donc b va prendre sa valeur par défaut.

    3;而 b 未被传入,因此 b 将采用默认值。

  63. B égale 2. Ensuite, je passe à la ligne d'après, A plus égale B,

    b 等于 2。接着执行下一行:a += b,

  64. donc A est égal à A plus B.

    即 a 等于 a 加上 b。

  65. C'est à dire 3 plus 2, 5.

    也就是 3 加 2,等于 5。

  66. Et je renvoie la valeur de a.

    最后我返回 a 的值。

  67. Donc là ici, je renvoie la valeur de a, je renvoie 5.

    所以这里我返回 a 的值,即返回 5。

  68. Ça veut dire que là, je suis

    这意味着我现在

  69. là et je reviens à l'endroit d'où j'étais parti.

    回到此处,并返回到最初调用的位置。