選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
このリポジトリはアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュや、課題・プルリクエストのオープンはできません。

python-02.tex 14 KiB

5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  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{Modifer 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}