You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

пре 5 година
пре 5 година
пре 5 година
пре 5 година
пре 5 година
пре 5 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. % Programmation avec Python (chapitre 4)
  2. % Dimitri Merejkowsky
  3. \center \huge Les tuples
  4. # Création de tuples
  5. ```python
  6. mon_tuple = tuple() # un tuple vide
  7. mon_tuple = () # aussi un tuple vide
  8. mon_tuple = (1, 2) # un tuple à deux éléments
  9. ```
  10. # Note
  11. C'est la virgule qui fait le tuple, pas les parenthèses
  12. (on n'utilise les parenthèses que pour l'esthétique)
  13. \vfill
  14. ```python
  15. (1)
  16. # pas un tuple, juste le nombre 1 (entre parenthèses)
  17. (1,)
  18. # un tuple à un élément
  19. 1,
  20. # le *même* tuple
  21. ```
  22. # Indexation, test d'appartenance
  23. ```python
  24. >>> couple = ('Starsky', 'Hutch')
  25. >>> couple[0]
  26. 'Starsky'
  27. >>> couple[1]
  28. 'Hutch'
  29. >>> couple[3]
  30. IndexError
  31. >>> 'Starsky' in couple
  32. True
  33. >>> 'Batman' in couple
  34. False
  35. ```
  36. Rien de nouveau en principe :p
  37. # Déstructuration
  38. Créer plusieurs variables en une seule ligne
  39. ```python
  40. >>> couple = ("Batman", "Robin")
  41. >>> héro, side_kick = couple
  42. >>> héro
  43. 'Batman'
  44. >>> side_kick
  45. 'Robin'
  46. ```
  47. On dit aussi: unpacking
  48. # Quelques erreurs
  49. ```python
  50. >>> héro, side_kick, ennemi = couple
  51. ValueError (3 != 2)
  52. >>> (héro,) = couple
  53. ValueError (1 != 2)
  54. # Gare à la virgule:
  55. >>> héro, = couple
  56. ValueError (1 != 2)
  57. ```
  58. # Pièges
  59. ```python
  60. f(a, b, c) # appelle f() avec trois arguments
  61. f((a, b, c)) # appelle f() avec un seul argument
  62. # (qui est lui-même un tuple à 3 valeurs)
  63. ```
  64. # On peut aussi déstructurer des listes
  65. ```python
  66. >>> fruits = ["pomme", "banane", "orange"]
  67. >>> premier, deuxième, troisième = fruits
  68. ```
  69. # Retour multiple
  70. Retourner plusieurs valeurs:
  71. ```python
  72. def tire_carte(():
  73. valeur = "10"
  74. couleur = "trèfle"
  75. return (valeur, couleur)
  76. (v, c) = tire_carte()
  77. print(v, "de", c)
  78. # 10 de trèfle
  79. ```
  80. \vfill
  81. En fait c'est juste une manipulation de tuples :)
  82. # Les tuples sont immuables
  83. ```python
  84. >>> couple = ('Starsky', 'Hutch')
  85. >>> couple[0] = 'Batman'
  86. TypeError
  87. ```
  88. Les méthodes `count()` et `index()` existent
  89. parce qu'elles ne modifient pas le tuple.
  90. # Les tuples sont immuables (2)
  91. Les méthodes qui modifieraient le tuple n'existent pas:
  92. ```python
  93. >>> couple = ('Starsky', 'Hutch')
  94. >>> couple.clear()
  95. AttributeError
  96. ```
  97. #
  98. \center Mutables, immuables, et références
  99. # Mutables et immuables
  100. * Mutables: listes, ensembles, dictionnaires
  101. * Immuables: entiers, flottants, booléens, strings
  102. # Passage par référence
  103. En Python, on ne manipule jamais les objets directement, on
  104. ne manipule que des *références* sur ces objets.
  105. ```python
  106. x = 3 # x est une référence vers l'objet 'entier 3'
  107. x = "hello" # x référence une string
  108. ```
  109. # Exemple 1
  110. ```python
  111. def ajoute_trois(x):
  112. x = x + 3 # crée une nouvelle référence
  113. mon_entier = 42
  114. ajoute_trois(mon_entier)
  115. # 'mon_entier' vaut toujours 42
  116. ```
  117. # Exemple 2
  118. ```python
  119. def ajoute_trois(l):
  120. l.append(3)
  121. # Ne crée pas de nouvelle référence
  122. # Appelle une méthode qui modifie 'l' sur place
  123. ma_liste = [1, 2]
  124. ajoute_trois(ma_liste)
  125. # 'ma_liste' vaut maintenant [1, 2, 3]
  126. ```
  127. # Exemple 3
  128. ```python
  129. def get_max(liste):
  130. autre_liste = liste.copy()
  131. autre_liste.sort()
  132. return autre_liste[-1]
  133. ma_liste = [1, 3, 2]
  134. x = get_max(ma_liste)
  135. # x = 3
  136. # `ma_liste` n'a pas changé
  137. ```
  138. # Notes
  139. * on peut aussi utiliser la fonction native "max()"
  140. * on peut aussi utiliser une slice: `autre_liste = liste[:]`
  141. # Valeur par défaut
  142. ```python
  143. def exemple_bizarre(l=[1, 2, 3]):
  144. l.append(4)
  145. return l
  146. >>> exemple_bizarre()
  147. [1, 2, 3, 4]
  148. >>> exemple_bizarre()
  149. [1, 2, 3, 4, 4]
  150. ```
  151. * Les arguments par défaut ne sont évalué qu'une seule fois)
  152. # Valeur par défaut (2)
  153. Parfois, ce comportement *peut* être voulu
  154. \vfill
  155. ```python
  156. def grosse_fonction(x, cache=dict()):
  157. if x in cache:
  158. return cache[x]
  159. else:
  160. resultat = ... # plein de calculs
  161. cache[x] = resultat
  162. return resultat
  163. ```
  164. # Valeur par défaut (3)
  165. Sinon, remplacez l'argument mutable par un argument immutable
  166. ```python
  167. def exemple_bizarre(l=None):
  168. if not l:
  169. l = [1, 2, 3]
  170. l.append(4)
  171. return l
  172. >>> exemple_bizarre()
  173. [1, 2, 3, 4]
  174. >>> exemple_bizarre()
  175. [1, 2, 3, 4, 4]
  176. ```
  177. # Conclusions
  178. * Une fonction ne peut modifier la valeur de ses arguments qui s'ils sont
  179. mutables.
  180. * Toutes les copies doivent être explicites
  181. #
  182. \center Itérer sur les dictionnaires
  183. # Itérer sur les clés
  184. ```python
  185. scores = { "alice": 3, "bob": 4 }
  186. for prénom in scores:
  187. score = scores[prénom]
  188. print(prénom, score)
  189. ```
  190. \vfill
  191. Même chose avec la méthode `.keys()`
  192. ```python
  193. for prénom in scores.keys():
  194. ...
  195. ```
  196. # Itérer sur les valeurs
  197. ```python
  198. scores = { "alice": 3, "bob": 4 }
  199. for score in scores.values():
  200. print(score)
  201. ```
  202. # Itérer sur les clés *et* les valeurs
  203. ```python
  204. for (prénom, score) in scores.items()
  205. print(prénom, score)
  206. ```
  207. \vfill
  208. Notes:
  209. * on a gagné une ligne par rapport au premier exemple.
  210. * `items()` renvoie une liste de tuples
  211. # Presque des listes
  212. Les méthodes `.keys()`, `.values()` et `.items()` ne retournent pas des listes,
  213. mais des "vues".
  214. ```python
  215. >>> prénoms = scores.keys()
  216. >>> prénoms[1]
  217. TypeError: 'dict_keys' object does not support indexing
  218. ```
  219. \vfill
  220. On détaillera cette question plus tard.
  221. # Forcer des listes
  222. En attendant, vous pouvez convertir les vues en listes:
  223. ```python
  224. >>> prénoms = scores.keys()
  225. >>> premier_prénom = list(prénoms)[0]
  226. ```
  227. #
  228. \center \huge La programmation n'est pas un art solitaire
  229. # Le mythe
  230. > Un développeur dans son garage a une idée géniale,
  231. > l'implémente tout seul et gagne un tas de pognon.
  232. \vfill
  233. Ça n'existe pas (ou plus)
  234. * Sauf dans les fictions
  235. * Quasiment mon seul reproche à propos de la série *Silicon Valley*
  236. # La code review
  237. Ce qu'on a fait avec l'exercice de la dernière fois :)
  238. # Par mail - envoi
  239. ```text
  240. Bonjour Alice, voici une nouvelle fonction:
  241. def ma_fonction():
  242. ma_liste = ...
  243. if len(ma_liste) == 0:
  244. # la liste est vide
  245. signé: Bob
  246. ```
  247. # Par mail - réponse
  248. ```text
  249. Bonjour Bob, et merci pour ta contribution!
  250. def ma_fonction():
  251. ma_liste = ...
  252. if len(ma_liste) == 0:
  253. # la liste est vide
  254. >> Ici tu pourrais mettre `if not ma_liste`
  255. signé Alice
  256. ```
  257. # Par mail - envoi 2
  258. ```text
  259. Bonjour Alice, voici une nouvelle version de mes changements
  260. def ma_fonction():
  261. ma_liste = ...
  262. if not ma_liste:
  263. ...
  264. ```
  265. # Code review
  266. Croyez-le ou nom, plein de projets fonctionnent comme ça.
  267. Pas d'outil spécifiques, on peut tout faire avec des e-mail
  268. et du texte brut
  269. # D'autres outils
  270. Des outils essayent de "simplifier" le processus. En vrac: `gerrit`, `github`, `gitlab` ...
  271. Mais dans son essence le concept n'a pas changé
  272. #
  273. \center \huge Un atelier
  274. # Mob programming
  275. Ou programmation en foule
  276. # Les règles
  277. * Un pilote: le seul autorisé à modifier le code
  278. * Un copilote: indique au pilote quoi faire
  279. * On tourne toutes les 15 minutes
  280. # Le challenge
  281. On va prendre deux discours politique et faire de l'analyse automatique de texte dessus.
  282. Notamment, repérer les mots qui reviennent le plus
  283. # Jean Véronis - aparté
  284. Un universitaire malheureusement décédé s'en était fait une spécialité.
  285. Vous pouvez lire *Les Mots du Président* si ça vous dit.
  286. Il utilisait d'autres outils, bien sûr, mais ce qu'on va faire n'est pas si loin
  287. # Squelette du code
  288. Parlons-en!