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

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