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.
 
 
 
 
 
 

752 lines
13 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. a = 1
  153. b = 2
  154. c = add(a, b)
  155. print(c)
  156. \end{lstlisting}
  157. \end{frame}
  158. \begin{frame}[fragile]
  159. \frametitle{Paramètres nommés}
  160. \begin{lstlisting}
  161. def greet(name, shout=False):
  162. result = "Hello, "
  163. result += name
  164. if shout:
  165. result += "!"
  166. return result
  167. >>> greet("John")
  168. 'Hello, John'
  169. >>> greet("Jane", shout=True)
  170. 'Hello, Jane!'
  171. \end{lstlisting}
  172. \end{frame}
  173. \begin{frame}[fragile]
  174. \frametitle{Note}
  175. \texttt{print()} est une fonction :)
  176. \vfill
  177. On dit qu'elle est "built-in", ou "native" en Français,
  178. parce que vous n'avez pas eu à l'implémenter.
  179. \end{frame}
  180. \begin{frame}[fragile]
  181. \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
  182. Structures de données
  183. \end{beamercolorbox}
  184. \end{frame}
  185. \begin{frame}[fragile]
  186. \frametitle{Créer une liste}
  187. \begin{lstlisting}
  188. >>> ma_liste = list() # liste vide
  189. >>> ma_liste = [] # aussi une liste vide
  190. >>> ma_liste = [1, 2, 3] # trois entiers
  191. \end{lstlisting}
  192. \vfill
  193. \begin{alertblock}{Note}
  194. \texttt{list()} est \textbf{aussi} une fonction :)
  195. \end{alertblock}
  196. \end{frame}
  197. \begin{frame}[fragile]
  198. \frametitle{Listes hétérogènes}
  199. On peut mettre des types différents dans une même liste:
  200. \begin{lstlisting}
  201. >>> pommes_et_carottes = [True, 2, "trois"]
  202. \end{lstlisting}
  203. \vfill
  204. Et même des listes dans des listes:
  205. \begin{lstlisting}
  206. >>> liste_de_liste = [[1, 2], ["un", "deux"]]
  207. \end{lstlisting}
  208. \end{frame}
  209. \begin{frame}[fragile]
  210. \frametitle{Connaître la taille d'une liste}
  211. Avec la fonction \texttt{len()} (encore un built-in).
  212. \vfill
  213. \begin{lstlisting}
  214. >>> liste_vide = []
  215. >>> len(liste_vide)
  216. 0
  217. >>> autre_liste = [1, 2, 3]
  218. >>> len(autre_liste)
  219. 3
  220. \end{lstlisting}
  221. \end{frame}
  222. \begin{frame}[fragile]
  223. \frametitle{Indexer une liste}
  224. \begin{lstlisting}
  225. >>> liste = [1, 2, 3]
  226. >>> liste[0] # ca commence a zero
  227. 1
  228. >>> liste[4]
  229. IndexError
  230. \end{lstlisting}
  231. \vfill
  232. Astuce: l'index maximal est \texttt{len(list) -1} ;)
  233. \end{frame}
  234. \begin{frame}[fragile]
  235. \frametitle{Modifer une liste}
  236. \begin{lstlisting}
  237. >>> liste = [1, 2, 3]
  238. >>> liste[1] = 4
  239. >>> liste
  240. [1, 4, 3]
  241. \end{lstlisting}
  242. \end{frame}
  243. \begin{frame}[fragile]
  244. \frametitle{Itérer sur les éléments d'une liste}
  245. \begin{lstlisting}
  246. names = ["Alice", "Bob", "Charlie"]
  247. for name in names:
  248. print("Bonjour", name)
  249. Bonjour Alice
  250. Bonjour Bob
  251. Bonjour Charlie
  252. \end{lstlisting}
  253. \end{frame}
  254. \begin{frame}[fragile]
  255. \frametitle{Test de présence}
  256. Avec le mot-clé \texttt{in}:
  257. \vfill
  258. \begin{lstlisting}
  259. >>> fruits = ["pomme", "banane"]
  260. >>> "pomme" in fruits
  261. True
  262. >>> "orange" in fruits
  263. False
  264. \end{lstlisting}
  265. \end{frame}
  266. \begin{frame}[fragile]
  267. \frametitle{Ajout d'un élément}
  268. Avec \texttt{append()}
  269. \begin{lstlisting}
  270. >>> fruits.append("poire")
  271. >>> fruits
  272. ['pomme', 'banane', 'poire']
  273. \end{lstlisting}
  274. \vfill
  275. Notez le point entre `fruits` et `append`
  276. \end{frame}
  277. \begin{frame}[fragile]
  278. \frametitle{Autres opérations}
  279. \begin{lstlisting}
  280. >>> fruits = ["pomme", "poire"]
  281. >>> fruits.insert(1, "abricot")
  282. # ['pomme', 'abricot', 'poire']
  283. >>> fruits.remove("pomme")
  284. # ['abricot', 'poire']
  285. >>> fruits.remove("pas un fruit")
  286. Erreur!
  287. \end{lstlisting}
  288. \end{frame}
  289. \begin{frame}[fragile]
  290. \frametitle{Découper une string en liste}
  291. \begin{lstlisting}
  292. >>> message = "un deux trois"
  293. >>> message.split()
  294. ["un", "deux", "trois"]
  295. \end{lstlisting}
  296. \end{frame}
  297. \begin{frame}[fragile]
  298. \frametitle{Dictionnaires}
  299. Des clés et des valeurs:
  300. \begin{lstlisting}
  301. >>> mon_dico = dict() # dictionaire vide
  302. >>> mon_dico = {} # aussi un dictionnaire vide
  303. # deux cles et deux valeurs:
  304. >>> scores = {"john": 24, "jane": 23}
  305. >>> scores.keys()
  306. ["john", "jane"
  307. >>> mon_dico.values()
  308. [24, 23]
  309. \end{lstlisting}
  310. \end{frame}
  311. \begin{frame}[fragile]
  312. \frametitle{Insertion}
  313. \begin{lstlisting}
  314. >>> scores = {"john": 10 }
  315. >>> scores["john"] = 12 # John marque deux points
  316. >>> scores["bob"] = 3 # Bob entre dans la partie
  317. >>> scores["personne"]
  318. KeyError
  319. \end{lstlisting}
  320. \end{frame}
  321. \begin{frame}[fragile]
  322. \frametitle{Fusion de dictionnaires}
  323. \begin{lstlisting}
  324. >>> s1 = {"john": 12, "bob": 2}
  325. >>> s2 = {"bob": 3, "charlie": 4}
  326. >>> s1.update(s2)
  327. >>> s1
  328. {"john": 12, "bob": 3, "charlie": 4}
  329. \end{lstlisting}
  330. \end{frame}
  331. \begin{frame}[fragile]
  332. \frametitle{Destruction}
  333. \begin{lstlisting}
  334. >>> scores = {"john": 12, "bob": 23}
  335. >>> scores.pop("john")
  336. # {"bob': 23}
  337. >>> scores.pop("personne")
  338. KeyError
  339. \end{lstlisting}
  340. \end{frame}
  341. \begin{frame}[fragile]
  342. \frametitle{Ensembles}
  343. Des objets sans ordre ni doublons.
  344. Création avec la fonction \texttt{set()}:
  345. \begin{lstlisting}
  346. >>> sac = set()
  347. >>> sac = {} # oups, c'est un dictionnaire vide!
  348. >>> sac = {"un", "deux"} # un ensemble de deux strings
  349. >>> len(sac) # les ensembles ont une taille
  350. >>> 2
  351. \end{lstlisting}
  352. \end{frame}
  353. \begin{frame}[fragile]
  354. \frametitle{Ajout d'un élement dans un ensemble}
  355. \begin{lstlisting}
  356. >>> sac = {"un", "deux"}
  357. >>> sac.add("trois"}
  358. # {"un", "deux", "trois"}
  359. >>> sac.add("un")
  360. # {"un", "deux", "trois"} # pas de changement
  361. \end{lstlisting}
  362. \end{frame}
  363. \begin{frame}[fragile]
  364. \frametitle{Autres opérations}
  365. \begin{lstlisting}
  366. >>> s1 = {"un", "deux"}
  367. >>> s2 = {"deux", "trois"}
  368. >>> s2.intersection(s1)
  369. # {"deux"}
  370. \end{lstlisting}
  371. Aussi:
  372. \begin{itemize}
  373. \item \texttt{update()}
  374. \item \texttt{union()}
  375. \item \texttt{difference()}
  376. \end{itemize}
  377. \end{frame}
  378. \begin{frame}[fragile]
  379. \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
  380. Jeu du pendu
  381. \end{beamercolorbox}
  382. \end{frame}
  383. \begin{frame}[fragile]
  384. \frametitle{Avant de commencer à coder}
  385. Coder sans réfléchir nuit à la qualité du code.
  386. \vfill
  387. Prenons le temps de la réflexion!
  388. \end{frame}
  389. \begin{frame}[fragile]
  390. \frametitle{Squelette}
  391. \begin{itemize}
  392. \item Lire les mots possibles depuis un fichier texte
  393. \item Choisir un mot au hasard
  394. \item Afficher un indice ("hint")
  395. \item Démarrer une boucle
  396. \begin{itemize}
  397. \item Demander une lettre
  398. \item Afficher l'indice mis à jour
  399. \item Vérfier si le jeu est fini
  400. \item Repartir au début de la boucle
  401. \end{itemize}
  402. \end{itemize}
  403. \end{frame}
  404. \begin{frame}[fragile]
  405. \frametitle{Une liste de mots Français}
  406. À télecharger ici:
  407. \url{https://github.com/E2L/cours-python/blob/master/sources/pendu.txt}.
  408. \end{frame}
  409. \begin{frame}[fragile]
  410. \frametitle{Une fonction par tâche}
  411. \begin{itemize}
  412. \item \texttt{read\_words()}
  413. \item \texttt{choose\_word()}
  414. \item \texttt{display\_hint()}
  415. \item \texttt{has\_won()}
  416. \end{itemize}
  417. \end{frame}
  418. \begin{frame}[fragile]
  419. \frametitle{Structure de données}
  420. \begin{itemize}
  421. \item Une liste pour les mots dans le fichier
  422. \item Un ensemble pour les bonnes lettre devinées
  423. \end{itemize}
  424. \end{frame}
  425. \begin{frame}[fragile]
  426. \frametitle{C'est parti!}
  427. Le moment est venu d'écrire le code.
  428. Les sources sont sur GitHub:
  429. \url{https://github.com/E2L/cours-python}. \\~\\
  430. Mais il vaut mieux recopier le code vous-mêmes.
  431. \end{frame}
  432. \begin{frame}[fragile]
  433. \frametitle{Implémentation: lire un fichier}
  434. \begin{itemize}
  435. \item \texttt{open()} renvoie un "objet fichier"
  436. \item \texttt{file.read()} lit le fichier \textbf{en entier} et retourne une string
  437. \item \texttt{file.close()} ferme le fichier
  438. \end{itemize}
  439. \begin{alertblock}{Note}
  440. N'oubliez pas de fermer tous les fichiers que vous ouvrez!
  441. \end{alertblock}
  442. \end{frame}
  443. \begin{frame}[fragile]
  444. \frametitle{Implémentation: lire un fichier}
  445. \begin{lstlisting}
  446. def read_words():
  447. file = open("pendu.txt")
  448. contents = file.read()
  449. file.close()
  450. words = contents.splitlines()
  451. return words
  452. \end{lstlisting}
  453. \end{frame}
  454. \begin{frame}[fragile]
  455. \frametitle{Choisir un mot au hasard dans la liste}
  456. \begin{lstlisting}
  457. import random # remember me?
  458. def choose_word(words):
  459. n = len(words)
  460. index = random.randint(0, n-1)
  461. return words[index]
  462. \end{lstlisting}
  463. Rappel: les index commencent à zéro et se terminent à \texttt{len - 1}.
  464. \end{frame}
  465. \begin{frame}[fragile]
  466. \frametitle{Afficher les lettres devinées}
  467. \begin{lstlisting}
  468. def display_hint(word, letters):
  469. for letter in word:
  470. if letter in letters:
  471. print(letter, end="")
  472. else:
  473. print("_", end="")
  474. print("")
  475. \end{lstlisting}
  476. \begin{lstlisting}
  477. >>> display_hint("vache", {"a"})
  478. _a___
  479. >>> display_hint("vache", {"a", "c"})
  480. _ac__
  481. \end{lstlisting}
  482. \end{frame}
  483. \begin{frame}[fragile]
  484. \frametitle{Find de partie}
  485. Le joueur a gagné si toutes les lettres ont
  486. été devinées:
  487. \vfill
  488. \begin{lstlisting}
  489. def has_won(word, letters):
  490. for letter in word:
  491. if letter not in letters:
  492. return False
  493. return True
  494. \end{lstlisting}
  495. \end{frame}
  496. \begin{frame}[fragile]
  497. \frametitle{Boucle principale}
  498. \begin{lstlisting}
  499. words = read_words()
  500. word = choose_word(words)
  501. letters = set()
  502. display_hint(word, letters)
  503. while True:
  504. new_letter = input()
  505. letters.add(new_letter)
  506. display_hint(word, letters)
  507. if has_won(word, letters):
  508. print("OK")
  509. return
  510. \end{lstlisting}
  511. \end{frame}
  512. \begin{frame}[fragile]
  513. \frametitle{Une tradition}
  514. Traditionnelement, on appelle ce genre de fonction \texttt{main()}:
  515. \begin{lstlisting}
  516. def main():
  517. words = read_words()
  518. word = choose_word(words)
  519. ...
  520. main() # ne pas oublier de l'appeler!
  521. \end{lstlisting}
  522. \end{frame}
  523. \begin{frame}[fragile]
  524. \frametitle{Pour la prochaine fois}
  525. Notez que le jouer \textbf{ne peut pas perdre}.
  526. \vfill
  527. Si vous le souhaitez, essayer d'adapter le code pour limiter le nombre d'essais:
  528. \begin{itemize}
  529. \item Afficher le nombre d'essais restant à chaque coup
  530. \item Afficher la réponse et un message d'erreur si le jouer a dépassé le
  531. nombre maximum d'essais.
  532. \end{itemize}
  533. Envoyez-moi vos solutions à d.merej@gmail.com!
  534. \end{frame}
  535. \end{document}