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.
 
 
 
 
 
 

801 lines
14 KiB

  1. \documentclass{beamer}
  2. \usepackage[utf8]{inputenc}
  3. \usepackage{hyperref}
  4. \usepackage{listings}
  5. \lstset{language=Python, showstringspaces=false}
  6. \usetheme{Madrid}
  7. \hypersetup{colorlinks=true}
  8. \title{Introduction à la programmation avec Python \\ (chapitre 2)}
  9. \author{Dimitri Merejkowsky}
  10. \institute{E2L}
  11. \begin{document}
  12. \frame{\titlepage}
  13. \begin{frame}
  14. \frametitle{Plan}
  15. \begin{itemize}
  16. \item Retours sur le chapitre 1
  17. \item Fonctions
  18. \item Structures de données
  19. \end{itemize}
  20. \end{frame}
  21. \begin{frame}[fragile]
  22. \centering
  23. \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
  24. Retours sur le chapitre 1
  25. \end{beamercolorbox}
  26. \end{frame}
  27. \begin{frame}[fragile]
  28. \frametitle{Combiner assignation et opérations}
  29. \begin{lstlisting}
  30. >>> a = 3
  31. >>> a = a + 1
  32. 3
  33. \end{lstlisting}
  34. Même résultat que:
  35. \begin{lstlisting}
  36. >>> a = 3
  37. >>> a += 1
  38. \end{lstlisting}
  39. \vfill
  40. Marche aussi avec \texttt{-=}, \texttt{*=} etc.
  41. \end{frame}
  42. \begin{frame}[fragile]
  43. \frametitle{Retour sur les strings}
  44. \texttt{\textbackslash n} sert à échapper les retours à la ligne:
  45. \begin{lstlisting}
  46. >>> text = "Je suis un message\nSur deux lignes")
  47. >>> print(text)
  48. Je suis un message
  49. Sur deux lignes
  50. \end{lstlisting}
  51. \end{frame}
  52. \begin{frame}[fragile]
  53. \frametitle{Concaténation implicite}
  54. Pas besoin de `+` pour concaténer des "littéraux".
  55. \begin{lstlisting}
  56. >>> text = "Je suis une " "longue" " string"
  57. >>> text
  58. 'Je suis une longue string'
  59. \end{lstlisting}
  60. \end{frame}
  61. \begin{frame}[fragile]
  62. \frametitle{Répéter une string}
  63. \begin{lstlisting}
  64. >>> "argh " * 3
  65. argh argh argh
  66. \end{lstlisting}
  67. \end{frame}
  68. \begin{frame}[fragile]
  69. \frametitle{Faire une longue string sur plusieurs lignes}
  70. \begin{lstlisting}
  71. poeme = """
  72. Ceci est un poeme
  73. Qui contient "des quotes"
  74. Et parle d'autre choses ...
  75. """
  76. \end{lstlisting}
  77. \begin{block}{Note}
  78. Marche aussi avec des "triples-simple-quotes", mais c'est moins lisible :P
  79. \end{block}
  80. \end{frame}
  81. \begin{frame}[fragile]
  82. \frametitle{Opérations sur les strings (1)}
  83. \begin{lstlisting}
  84. >>> text = " bonjour! \n "
  85. >>> text.strip()
  86. "bonjour!"
  87. \end{lstlisting}
  88. Nouvelle syntaxe: notez le '.' entre la variable et la "fonction".
  89. \end{frame}
  90. \begin{frame}[fragile]
  91. \frametitle{Opérations sur les strings (2)}
  92. Modification de la casse:
  93. \begin{lstlisting}
  94. >>> text = "Hello"
  95. >>> text.upper()
  96. "HELLO"
  97. >>> text = "Au Revoir"
  98. >>> text.lower()
  99. "au revoir"
  100. >>> text = "ceci est un titre"
  101. >>> text.title()
  102. "Ceci est un titre"
  103. \end{lstlisting}
  104. \end{frame}
  105. \begin{frame}[fragile]
  106. \frametitle{Retour sur input()}
  107. On peut afficher un message avant de lire l'entrée utilisateur.
  108. \begin{lstlisting}
  109. # A adapter
  110. import random
  111. secret = random.randint()
  112. print("Devine le nombre auquel je pense")
  113. while True:
  114. reponse = input("Ta reponse: ")
  115. response = int(response)
  116. ...
  117. \end{lstlisting}
  118. \end{frame}
  119. \begin{frame}[fragile]
  120. \frametitle{Retour sur print()}
  121. On peut spécifier le caractère de fin. \textbackslash n par défaut.
  122. \begin{lstlisting}
  123. # Dans hello.py
  124. print("Bonjour", end=" ")
  125. print("monde", end="!\n")
  126. \end{lstlisting}
  127. \begin{lstlisting}
  128. $ python hello.py
  129. Bonjour monde!
  130. \end{lstlisting}
  131. \end{frame}
  132. \begin{frame}[fragile]
  133. \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
  134. Fonctions
  135. \end{beamercolorbox}
  136. \end{frame}
  137. \begin{frame}[fragile]
  138. \frametitle{Sans arguments}
  139. \begin{lstlisting}
  140. def say_hello():
  141. print("Hello")
  142. say_hello()
  143. \end{lstlisting}
  144. \vfill
  145. Notez l'utilisation des parenthèses pour \emph{appeler} la fonction
  146. \end{frame}
  147. \begin{frame}[fragile]
  148. \frametitle{Définition simple}
  149. \begin{lstlisting}
  150. def add(a, b):
  151. return a + b
  152. nombre_1 = 1
  153. nombre_2 = 2
  154. total = add(nombre_1, nombre_2)
  155. print(total)
  156. \end{lstlisting}
  157. \vfill
  158. Affiche \texttt{3}.
  159. \end{frame}
  160. \begin{frame}[fragile]
  161. \frametitle{Paramètres nommés}
  162. \begin{lstlisting}
  163. def greet(name, shout=False):
  164. result = "Hello, "
  165. result += name
  166. if shout:
  167. result += "!"
  168. return result
  169. >>> greet("John")
  170. 'Hello, John'
  171. >>> greet("John", shout=False) # meme resultat
  172. 'Hello, John'
  173. >>> greet("Jane", shout=True)
  174. 'Hello, Jane!'
  175. \end{lstlisting}
  176. \end{frame}
  177. \begin{frame}[fragile]
  178. \frametitle{Note}
  179. \texttt{print()} est une fonction :)
  180. \vfill
  181. On dit qu'elle est "built-in", ou "native" en Français,
  182. parce que vous n'avez pas eu à l'implémenter.
  183. \end{frame}
  184. \begin{frame}[fragile]
  185. \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
  186. Structures de données
  187. \end{beamercolorbox}
  188. \end{frame}
  189. \begin{frame}[fragile]
  190. \frametitle{Créer une liste}
  191. \begin{lstlisting}
  192. >>> ma_liste = list() # liste vide
  193. >>> ma_liste = [] # aussi une liste vide
  194. >>> ma_liste = [1, 2, 3] # trois entiers
  195. \end{lstlisting}
  196. \vfill
  197. \begin{alertblock}{Note}
  198. \texttt{list()} est \textbf{aussi} une fonction :)
  199. \end{alertblock}
  200. \end{frame}
  201. \begin{frame}[fragile]
  202. \frametitle{Listes hétérogènes}
  203. On peut mettre des types différents dans une même liste:
  204. \begin{lstlisting}
  205. >>> pommes_et_carottes = [True, 2, "trois"]
  206. \end{lstlisting}
  207. \vfill
  208. Et même des listes dans des listes:
  209. \begin{lstlisting}
  210. >>> liste_de_liste = [[1, 2], ["un", "deux"]]
  211. \end{lstlisting}
  212. \end{frame}
  213. \begin{frame}[fragile]
  214. \frametitle{Connaître la taille d'une liste}
  215. Avec la fonction \texttt{len()} (encore un built-in).
  216. \vfill
  217. \begin{lstlisting}
  218. >>> liste_vide = []
  219. >>> len(liste_vide)
  220. 0
  221. >>> autre_liste = [1, 2, 3]
  222. >>> len(autre_liste)
  223. 3
  224. \end{lstlisting}
  225. \end{frame}
  226. \begin{frame}[fragile]
  227. \frametitle{Indexer une liste}
  228. \begin{lstlisting}
  229. >>> liste = [1, 2, 3]
  230. >>> liste[0] # ca commence a zero
  231. 1
  232. >>> liste[4]
  233. IndexError
  234. \end{lstlisting}
  235. \vfill
  236. Astuce: l'index maximal est \texttt{len(list) -1} ;)
  237. \end{frame}
  238. \begin{frame}[fragile]
  239. \frametitle{Modifier une liste}
  240. \begin{lstlisting}
  241. >>> liste = [1, 2, 3]
  242. >>> liste[1] = 4
  243. >>> liste
  244. [1, 4, 3]
  245. \end{lstlisting}
  246. \end{frame}
  247. \begin{frame}[fragile]
  248. \frametitle{Itérer sur les éléments d'une liste}
  249. \begin{lstlisting}
  250. names = ["Alice", "Bob", "Charlie"]
  251. for name in names:
  252. print("Bonjour", name)
  253. Bonjour Alice
  254. Bonjour Bob
  255. Bonjour Charlie
  256. \end{lstlisting}
  257. \end{frame}
  258. \begin{frame}[fragile]
  259. \frametitle{Test de présence}
  260. Avec le mot-clé \texttt{in}:
  261. \vfill
  262. \begin{lstlisting}
  263. >>> fruits = ["pomme", "banane"]
  264. >>> "pomme" in fruits
  265. True
  266. >>> "orange" in fruits
  267. False
  268. \end{lstlisting}
  269. \end{frame}
  270. \begin{frame}[fragile]
  271. \frametitle{Ça marche aussi avec les strings}
  272. Les strings sont \emph{presque} des liste de lettres:
  273. \begin{lstlisting}
  274. for letter in "vache":
  275. print(letter)
  276. v
  277. a
  278. c
  279. h
  280. e
  281. \end{lstlisting}
  282. \begin{lstlisting}
  283. >>> "v" in "vache"
  284. True
  285. >>> 'x' in "vache"
  286. False
  287. \end{lstlisting}
  288. \end{frame}
  289. \begin{frame}[fragile]
  290. \frametitle{Ajout d'un élément}
  291. Avec \texttt{append()}
  292. \begin{lstlisting}
  293. >>> fruits.append("poire")
  294. >>> fruits
  295. ['pomme', 'banane', 'poire']
  296. \end{lstlisting}
  297. \vfill
  298. Notez le point entre `fruits` et `append`
  299. \end{frame}
  300. \begin{frame}[fragile]
  301. \frametitle{Autres opérations}
  302. \begin{lstlisting}
  303. >>> fruits = ["pomme", "poire"]
  304. >>> fruits.insert(1, "abricot")
  305. # ['pomme', 'abricot', 'poire']
  306. >>> fruits.remove("pomme")
  307. # ['abricot', 'poire']
  308. >>> fruits.remove("pas un fruit")
  309. Erreur!
  310. \end{lstlisting}
  311. \end{frame}
  312. \begin{frame}[fragile]
  313. \frametitle{Découper une string en liste (1)}
  314. \begin{lstlisting}
  315. >>> path = "documents/e2l/foo.py"
  316. >>> message.split("/")
  317. ["documents", "e2l", "foo"]
  318. \end{lstlisting}
  319. \end{frame}
  320. \begin{frame}[fragile]
  321. \frametitle{Découper une string en liste (2)}
  322. \begin{lstlisting}
  323. >>> texte = """"\
  324. ligne1
  325. ligne2
  326. ligne3
  327. """
  328. >>>texte.splitlines()
  329. ["ligne1", "ligne2", "ligne3"]
  330. \end{lstlisting}
  331. \end{frame}
  332. \begin{frame}[fragile]
  333. \frametitle{Dictionnaires}
  334. Des clés et des valeurs:
  335. \begin{lstlisting}
  336. >>> mon_dico = dict() # dictionaire vide
  337. >>> mon_dico = {} # aussi un dictionnaire vide
  338. # deux cles et deux valeurs:
  339. >>> scores = {"john": 24, "jane": 23}
  340. >>> scores.keys()
  341. ["john", "jane"
  342. >>> mon_dico.values()
  343. [24, 23]
  344. \end{lstlisting}
  345. \end{frame}
  346. \begin{frame}[fragile]
  347. \frametitle{Accès}
  348. \begin{lstlisting}
  349. >>> scores = {"john": 10 }
  350. >>> scores["john"]
  351. 10
  352. >>> scores["personne"]
  353. KeyError
  354. \end{lstlisting}
  355. \end{frame}
  356. \begin{frame}[fragile]
  357. \frametitle{Modification}
  358. \begin{lstlisting}
  359. >>> scores["john"] = 12 # John marque deux points
  360. >>> scores["bob"] = 3 # Bob entre dans la partie
  361. >>> scores
  362. {"john": 12, "bob": 3}
  363. \end{lstlisting}
  364. \vfill
  365. Même code pour mettre à jour une clé et en créer une!
  366. \end{frame}
  367. \begin{frame}[fragile]
  368. \frametitle{Destruction}
  369. \begin{lstlisting}
  370. >>> scores = {"john": 12, "bob": 23}
  371. >>> scores.pop("john")
  372. # {"bob': 23}
  373. >>> scores.pop("personne")
  374. KeyError
  375. \end{lstlisting}
  376. \end{frame}
  377. \begin{frame}[fragile]
  378. \frametitle{Ensembles}
  379. Des objets sans ordre ni doublons.
  380. Création avec la fonction \texttt{set()}:
  381. \begin{lstlisting}
  382. >>> sac = set()
  383. >>> sac = {} # oups, c'est un dictionnaire vide!
  384. >>> sac = {"un", "deux"} # un ensemble de deux strings
  385. >>> len(sac) # les ensembles ont une taille
  386. >>> 2
  387. \end{lstlisting}
  388. \end{frame}
  389. \begin{frame}[fragile]
  390. \frametitle{Ajout d'un élement dans un ensemble}
  391. \begin{lstlisting}
  392. >>> sac = {"un", "deux"}
  393. >>> sac.add("trois"}
  394. # {"un", "deux", "trois"}
  395. >>> sac.add("un")
  396. # {"un", "deux", "trois"} # pas de changement
  397. \end{lstlisting}
  398. \end{frame}
  399. \begin{frame}[fragile]
  400. \frametitle{Autres opérations}
  401. \begin{lstlisting}
  402. >>> s1 = {"un", "deux"}
  403. >>> s2 = {"deux", "trois"}
  404. >>> s2.intersection(s1)
  405. # {"deux"}
  406. \end{lstlisting}
  407. Aussi:
  408. \begin{itemize}
  409. \item \texttt{update()}
  410. \item \texttt{union()}
  411. \item \texttt{difference()}
  412. \end{itemize}
  413. \end{frame}
  414. \begin{frame}[fragile]
  415. \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
  416. Jeu du pendu
  417. \end{beamercolorbox}
  418. \end{frame}
  419. \begin{frame}[fragile]
  420. \frametitle{Avant de commencer à coder}
  421. Coder sans réfléchir nuit à la qualité du code.
  422. \vfill
  423. Prenons le temps de la réflexion!
  424. \end{frame}
  425. \begin{frame}[fragile]
  426. \frametitle{Squelette}
  427. \begin{itemize}
  428. \item Lire les mots possibles depuis un fichier texte
  429. \item Choisir un mot au hasard
  430. \item Afficher un indice ("hint")
  431. \item Démarrer une boucle
  432. \begin{itemize}
  433. \item Demander une lettre
  434. \item Afficher l'indice mis à jour
  435. \item Vérfier si le jeu est fini
  436. \item Repartir au début de la boucle
  437. \end{itemize}
  438. \end{itemize}
  439. \end{frame}
  440. \begin{frame}[fragile]
  441. \frametitle{Une liste de mots Français}
  442. À télecharger ici:
  443. \url{https://github.com/E2L/cours-python/blob/master/sources/pendu.txt}.
  444. \end{frame}
  445. \begin{frame}[fragile]
  446. \frametitle{Une fonction par tâche}
  447. \begin{itemize}
  448. \item \texttt{read\_words()}
  449. \item \texttt{choose\_word()}
  450. \item \texttt{display\_hint()}
  451. \item \texttt{has\_won()}
  452. \end{itemize}
  453. \end{frame}
  454. \begin{frame}[fragile]
  455. \frametitle{Structure de données}
  456. \begin{itemize}
  457. \item Une liste pour les mots dans le fichier
  458. \item Un ensemble pour les bonnes lettre devinées
  459. \end{itemize}
  460. \end{frame}
  461. \begin{frame}[fragile]
  462. \frametitle{C'est parti!}
  463. Le moment est venu d'écrire le code.
  464. Les sources sont sur GitHub:
  465. \url{https://github.com/E2L/cours-python}. \\~\\
  466. Mais il vaut mieux recopier le code vous-mêmes.
  467. \end{frame}
  468. \begin{frame}[fragile]
  469. \frametitle{Implémentation: lire un fichier}
  470. \begin{itemize}
  471. \item \texttt{open()} renvoie un "objet fichier"
  472. \item \texttt{file.read()} lit le fichier \textbf{en entier} et retourne une string
  473. \item \texttt{file.close()} ferme le fichier
  474. \end{itemize}
  475. \begin{alertblock}{Note}
  476. N'oubliez pas de fermer tous les fichiers que vous ouvrez!
  477. \end{alertblock}
  478. \end{frame}
  479. \begin{frame}[fragile]
  480. \frametitle{Implémentation: lire un fichier}
  481. \begin{lstlisting}
  482. def read_words():
  483. file = open("pendu.txt")
  484. contents = file.read()
  485. file.close()
  486. words = contents.splitlines()
  487. return words
  488. \end{lstlisting}
  489. \end{frame}
  490. \begin{frame}[fragile]
  491. \frametitle{Choisir un mot au hasard dans la liste}
  492. \begin{lstlisting}
  493. import random # remember me?
  494. def choose_word(words):
  495. n = len(words)
  496. index = random.randint(0, n-1)
  497. return words[index]
  498. \end{lstlisting}
  499. Rappel: les index commencent à zéro et se terminent à \texttt{len - 1}.
  500. \end{frame}
  501. \begin{frame}[fragile]
  502. \frametitle{Afficher les lettres devinées}
  503. \begin{lstlisting}
  504. def display_hint(word, letters):
  505. for letter in word:
  506. if letter in letters:
  507. print(letter, end="")
  508. else:
  509. print("_", end="")
  510. print("")
  511. \end{lstlisting}
  512. \begin{lstlisting}
  513. >>> display_hint("vache", {"a"})
  514. _a___
  515. >>> display_hint("vache", {"a", "c"})
  516. _ac__
  517. \end{lstlisting}
  518. \end{frame}
  519. \begin{frame}[fragile]
  520. \frametitle{Find de partie}
  521. Le joueur a gagné si toutes les lettres ont
  522. été devinées:
  523. \vfill
  524. \begin{lstlisting}
  525. def has_won(word, letters):
  526. for letter in word:
  527. if letter not in letters:
  528. return False
  529. return True
  530. \end{lstlisting}
  531. \end{frame}
  532. \begin{frame}[fragile]
  533. \frametitle{Boucle principale}
  534. \begin{lstlisting}
  535. words = read_words()
  536. word = choose_word(words)
  537. letters = set()
  538. display_hint(word, letters)
  539. while True:
  540. new_letter = input()
  541. letters.add(new_letter)
  542. display_hint(word, letters)
  543. if has_won(word, letters):
  544. print("OK")
  545. break # interrompt la boucle parente
  546. \end{lstlisting}
  547. \end{frame}
  548. \begin{frame}[fragile]
  549. \frametitle{Une tradition}
  550. Traditionnellement, on appelle ce genre de fonction \texttt{main()}:
  551. \begin{lstlisting}
  552. def main():
  553. words = read_words()
  554. word = choose_word(words)
  555. ...
  556. if has_won(words, letters):
  557. print("Ok")
  558. return # sort de la fonction tout de suite
  559. main() # ne pas oublier de l'appeler!
  560. \end{lstlisting}
  561. \end{frame}
  562. \begin{frame}[fragile]
  563. \frametitle{Pour la prochaine fois}
  564. Notez que le joueur \textbf{ne peut pas perdre}.
  565. \vfill
  566. Si vous le souhaitez, essayer d'adapter le code pour limiter le nombre d'essais:
  567. \begin{itemize}
  568. \item Afficher le nombre d'essais restant à chaque coup
  569. \item Afficher la réponse et un message d'erreur si le jouer a dépassé le
  570. nombre maximum d'essais.
  571. \end{itemize}
  572. Envoyez-moi vos solutions à d.merej@gmail.com!
  573. \end{frame}
  574. \end{document}