-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathitinerables.html
More file actions
224 lines (201 loc) · 10.2 KB
/
itinerables.html
File metadata and controls
224 lines (201 loc) · 10.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<!DOCTYPE html>
<html lang="fr">
<!-- Meta-données -->
<head>
<meta charset="utf-8">
<title>Itinérables - Cours - PythonMasterClass</title>
<link rel="icon" type="image/png" sizes="32x32" href="./images/icons/icon.png">
<link href="css/styles.css" rel="stylesheet" type="text/css">
<!-- Police du h1 -->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@700&display=swap" rel="stylesheet">
<!-- CodeMirror -->
<link rel="stylesheet" href="plugin/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="plugin/codemirror/theme/monokai.css">
<script src="plugin/codemirror/lib/codemirror.js"></script>
<script src="plugin/codemirror/mode/python/python.js"></script>
</head>
<!-- Corps de la page -->
<body>
<!-- Haut de page -->
<header>
<!-- Logo -->
<a href="breviaire.html"><img src="images/logos/logo.png" alt="PythonMasterClass"></a>
<!-- Barre de navigation -->
<nav>
<a href="index.html">Accueil</a>
<a href="introduction.html" id="selected">Cours</a>
<a href="breviaire.html">Bréviaire</a>
<a href="contact.html">Contact</a>
</nav>
</header>
<!-- Contenue de la page -->
<main>
<section>
<div id="toph1"><h1>Itinérables</h1></div>
<div id="sommaire">
<nav>
<span>Sommaire</span>
<a href="introduction.html">Introduction</a>
<a href="installation.html">Installation</a>
<a href="erreurs.html">Erreurs</a>
<a href="variables.html">Variables</a>
<a href="booleans.html">Booleans</a>
<a href="conditions.html">Conditions</a>
<a href="boucle_while.html">Boucle While</a>
<a href="boucle_for.html">Boucle for</a>
<a href="list_et_tuple.html">List et tuple</a>
<a href="dictionnaires.html">Dictionnaires</a>
<a href="fonctions.html">Fonctions</a>
<a href="lambda.html">Lambda</a>
<a href="itinerables.html">Itinérables</a>
<a href="yield.html">Yield</a>
<a href="modularite.html">Modularité</a>
<a href="class.html">Class</a>
<a href="methodes.html">Méthodes</a>
</nav>
</div>
<div id="with-sommaire">
<article>
<h2>Parcourir une liste</h2>
<p>
Comme vous l'avez vu précédemment les liste peuvent être parcourus dans des boucles for
en revanche vous n'avez pas encore vu comment cela était possible.
</p>
<p>
Pour qu'un objet soit parcourable il faut qu'il possède une méthode __iter__() qui sera appeller
lors de l'entrée dans une boucle ou la fonction iter().
</p>
<code>
for i in range(3, 10): # appel de __iter__ implicite
print(i)
for i in range(3, 10).__iter__(): # appel de __iter__ explicite
print(i)
</code>
<p>
Ces deux codes font donc exactement la même chose. On peut aussi le faire sous cette forme.
</p>
<code>
iterator = range(3, 10).__iter__()
while True:
try:
print(next(iterator)) # ou iterator.__next__()
except StopIteration:
break
</code>
<p>
À ce moment vous vous demander ce qui est next, c'est une methode qui permet d'obtenir le prochain élément
de l'iterator et dans le cas où il n'y a plus de valeur à renvoyer alors l'exception StopIteration est levé.
</p>
</article>
<article>
<h2>Des générateurs !</h2>
<p>
Comme vous avez pu le voir dans <a href="list_et_tuple.html">List et tuple</a>, un tuple est déclaré d'une certaine façons
</p>
<code>
pas_un_tuple = (n*3.14 for n in range(10))
print(pas_un_tuple)
un_tuple = tuple(n*3.14 for n in range(10))
print(un_tuple)
</code>
<p>Ce code donnera cela comme sortie console<p>
<code class="console">
<generator object <genexpr> at 0x000001C19B4F6120>
(0.0, 3.14, 6.28, 9.42, 12.56, 15.700000000000001, 18.84, 21.98, 25.12, 28.26)
</code>
<p>
Comme vous pouvez le voir la syntaxe (expresion de génération) et réserver au générateurs.
</p>
<p>
Mais quesqu'un générateur ? Est bien un générateur c'est un objet qui crée un iterable sur des valeurs ou objets.
Il permet en outre une écriture plus simple des boucles et évite de créé des listes qui prendront plus de place
que la gestion d'une valeurs générer une par une.
</p>
<code>
grande_liste = list(range(100000000))
# iterable plutot q'une deuxième liste
iterable_gande_liste_pair = (n for n in grande_liste if n%2==0)
</code>
<p>
Généralement les générateurs sont utilisé pour les grandes listes évitant de stocker plusieurs fois une même information
ou pour construire des objets (comme les listes par compréhension). range est aussi un générateur,
il crée une à une les valeurs et pas directement une liste.
</p>
</article>
<article>
<h2>reserved et filter, des fonctions sur des iterables</h2>
<p>
Eh oui, il n'y rien de mieux que ces deux exemples, reversed permet de parcourir
dans le sens inverse un iterable sans recrée une liste
et sans avoir besoin d'utiliser des indices, pour ce qui
est de filter c'est identique, cette fonction ne crée pas une nouvelle liste filtrée mais filtre au moment de l'itération.
Pour voir des exemples l'utilisation de filter vous allez voir dans <a href="lambda.html">le cours précédant</a>
</p>
<code>
mot = "salut"
for lettre in reversed(mot): #bonne maière
print(lettre, end="")
print()
for i in range(len(mot)): # mauvaise manière
print(mot[-i-1], end="")
</code>
</article>
<article>
<h2>Zip pour parcourir plusieurs générateurs</h2>
<p>
zip() est une fonction prenant en paramètre plusieurs itérables pour les parcourir simultanément,
vous l'utilser dans de rares cas mais elle est reste très utile lorsque la nécéssité d'un double parcours s'impose
</p>
<code>
nombres = [1, 2, 3]
nom_nombres = ["un", "deux", "trois"]
lettres = ["a", "b", "c", "d"]
print("zip(nombres, nom_nombres)")
for n, nom in zip(nombres, nom_nombres):
print(n, nom)
print("zip(nombres, lettres)")
for n, lettre in zip(nombres, lettres):
print(n, lettre)
</code>
<p>Sortie Console :</p>
<code class="console">
zip(nombres, nom_nombres)
1 un
2 deux
3 trois
zip(nombres, lettres)
1 a
2 b
3 c
</code>
</article>
<p>
Dans le prochains cours nous vérons les fonctions génératrices qui sont en lien très fort avec itérables !
</p>
</div>
<div id="bottombuttons">
<a id="goprev" class="botbutton" href="lambda.html">Lambda</a>
<a id="gotop" class="botbutton" href="#top">Retour en haut</a>
<a id="gonext" class="botbutton" href="yield.html">Yield</a>
</div>
</section>
</main>
<!-- Pied de page -->
<footer>
<!-- Copyright -->
<p><img src="images/icons/bugs.png" alt="Bug"> All rights reserved - PythonMasterClass 2020 <img src="images/icons/bugs.png" alt="Bug"></p>
<!-- Réseaux -->
<address>
<p>Réseaux :</p>
<a href="https://discord.com" target="_blank"><img id=discord src="images/logos/discord.png" alt="Discord"></a>
<a href="https://fr.linkedin.com" target="_blank"><img src="images/logos/linkedin.png" alt="Linkedin"></a>
<a href="https://www.instagram.com" target="_blank"><img src="images/logos/instagram.png" alt="Instagram"></a>
<a href="https://www.youtube.com" id=youtube target="_blank"><img src="images/logos/youtube.png" alt="Youtube"></a>
<a href="https://twitter.com" target="_blank"><img src="images/logos/twitter.png" alt="Twitter"></a>
</address>
</footer>
<!-- Script de configuration du code -->
<script src="js/codemirror.js"></script>
</body>
</html>