您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
此仓库已存档。您可以查看文件和克隆,但不能推送或创建工单/合并请求。

01-introduction.rst 4.0 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. Jouons avec les fonctions
  2. =========================
  3. Introduction
  4. ------------
  5. Reprenons ce qu'on a vu jusqu'ici.
  6. D'une part, on peut créer des variables en les assignant à une valeur::
  7. # Création d'une variable `x` avec la valeur 4
  8. x = 4
  9. D'autre part, on peut définir et appeler des fonctions::
  10. # Définition de la fonction:
  11. def dire_bonjour(nom):
  12. print("Bonjour " + nome
  13. # Appel
  14. dire_bonjour("Max")
  15. # Affiche: "Bonjour Max"
  16. Fonctions en tant que variables
  17. -------------------------------
  18. Il se trouve qu'en Python, on peut assigner des variables à ... des fonctions
  19. .. code-block:: python
  20. # Définition d'une fonction `dire_bonjour_en_français`
  21. def dire_bonjour_en_français(nom):
  22. print("Bonjour " + nom)
  23. # Définition d'une fonction `dire_bonjour_en_anglais`
  24. def dire_bonjour_en_anglais(nom):
  25. print("Hello " + nom)
  26. # Création d'une variable qui pointe sur la fonction française:
  27. ma_fonction_qui_dit_bonjour = dire_bonjour_en_français
  28. # Appel de la fonction:
  29. ma_fonction_qui_dit_bonjour("Max")
  30. # Affiche: Bonjour Max
  31. De façon cruciale, notez que l'on n'a *pas* mis de parenthèses à droite
  32. lorsqu'on a créé la variable `ma_fonction_qui_dit_bonjour`.
  33. On peut donc dire que lorsqu'on définit une fonction avec `def()` et un corps
  34. il y a en réalité deux étapes:
  35. 1. Python stocke le corps de la fonction quelque part
  36. 2. Il crée une variable pointant vers ce corps
  37. En Python, il est assez fréquent d'utiliser de code tel que celui-ci, souvent avec un dictionnaire::
  38. fonctions_connues = {
  39. "français": dire_bonjour_en_français,
  40. "anglais": dire_bonjour_en_anglais,
  41. }
  42. # Ici on stocke la langue parlée par l'utilisateur
  43. # et son prénom
  44. langue_parlée = ...
  45. prénom = ....
  46. if langue_parlée in fonctions_connues:
  47. fonction = fonctions_connues[langue_parlée]
  48. fonction(prénom)
  49. Fonctions en tant qu'argement d'autres fonctions
  50. ------------------------------------------------
  51. On a vu en début de chapitre qu'on peut créé des variables qui pointent
  52. vers des fonctions.
  53. Du coup, rien n'empêche de les passer en *argument* d'autres fonctions.
  54. Par exemple::
  55. def appelle_deux_fois(f):
  56. f()
  57. f()
  58. def crier():
  59. print("Aline !")
  60. appelle_deux_fois(crier)
  61. # Affiche:
  62. # Aline !
  63. # Aline !
  64. Fonctions imbriquées
  65. --------------------
  66. On peut aussi définir une fonction dans une autre fonction::
  67. def affiche_message(message):
  68. def affiche():
  69. print(message)
  70. affiche_message("Bonjour")
  71. # affiche: Bonjour
  72. Deux notes importantes:
  73. Premièrement, la fonction `affiche()` qui est imbriquées dans `affiche_message()` n'est pas
  74. accessible à l'éxtérieur de la fonction qui la contient. En d'autres termes, ce code
  75. ne fonctionne pas::
  76. def affiche_message(message):
  77. def affiche():
  78. print(message)
  79. affiche()
  80. # NameError: 'affiche' is not defined
  81. C'est un mécanisme similaire aux :ref:`portées des variables <portées-des-variables>` vu précédemment.
  82. Deuxièment, la fonction `affiche()` à l'intérieur de `affiche_message()`
  83. a accès à l'argument `message` de la fonction `affiche_message`. On appelle
  84. ça une "closure".
  85. Fonctions retournant des fonctions
  86. ----------------------------------
  87. En réalité, on combine souvent les closures avec des fonctions qui
  88. retournent d'autres fonctions::
  89. def fabrique_fonction_qui_additionne(n):
  90. def fonction_résultat(x):
  91. return x + n
  92. return fonction_résultat
  93. additionne_2 = fabrique_fonction_qui_additionne(2)
  94. y = additionne_2(5)
  95. print(y)
  96. # Affiche: 7
  97. Un autre paradigme
  98. -------------------
  99. Le fait qu'on puisse traiter les fonctions comme n'importe quelle
  100. autre valeur (c'est-à-dire les assigner à des variables, les passer
  101. en argument et les retourner), est caractéristique des langages
  102. dits "fonctionnels". Python est donc **à la fois** un
  103. langages *impératif*, *objet* et *fonctionnel*. On dit que
  104. c'est un langage *multi-paradigme*.