Qu'est-ce qu'un objet itérable ?

S'entraîner aux questions d'entrevue de programmation en Python

Kirill Smirnov

Data Science Consultant, Altran

Définition

objets itérables / Iterables — tout objet utilisable dans une boucle for

  • liste
  • tuple
  • ensemble (set)
  • dictionnaire
  • chaîne de caractères
S'entraîner aux questions d'entrevue de programmation en Python

Parcourir une liste ou un tuple

liste :

droids = ['R2-D2', 'TC-16', 'C-3PO']

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO

tuple :

droids = ('R2-D2', 'TC-16', 'C-3PO')

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO
S'entraîner aux questions d'entrevue de programmation en Python

Parcourir un set

battleships = {'X-Wing Fighter', 'Millennium Falcon', 'TIE Fighter'}

for battleship in battleships:
    print(battleship)
TIE Fighter
X-Wing Fighter
Millennium Falcon
S'entraîner aux questions d'entrevue de programmation en Python

Parcourir une chaîne

title = 'Star Wars'

for char in title:
    print(char)
S
t
a
r

W
a
r
s
S'entraîner aux questions d'entrevue de programmation en Python

Parcourir un dictionnaire

episodes = {
    'Episode I': 'The Phantom Menace',
    'Episode II': 'Attack of the Clones',
    'Episode III': 'Revenge of the Sith', 
    'Episode IV': 'A New Hope',
    'Episode V': 'The Empire Strikes Back',
    'Episode VI': 'Return of the Jedi'
}
for episode in episodes:
    print(episode)
Episode I
Episode II
Episode III
Episode IV
Episode V
Episode VI
S'entraîner aux questions d'entrevue de programmation en Python

Obtenir des paires clé-valeur

episodes = {
    'Episode I': 'The Phantom Menace',
    'Episode II': 'Attack of the Clones',
    'Episode III': 'Revenge of the Sith', 
    'Episode IV': 'A New Hope',
    'Episode V': 'The Empire Strikes Back',
    'Episode VI': 'Return of the Jedi'
}
for item in episodes.items():
    print(item)
('Episode I', 'The Phantom Menace')
('Episode II', 'Attack of the Clones')
('Episode III', 'Revenge of the Sith')
('Episode IV', 'A New Hope')
('Episode V', 'The Empire Strikes Back')
('Episode VI', 'Return of the Jedi')
S'entraîner aux questions d'entrevue de programmation en Python

Obtenir des paires clé-valeur

episodes = {
    'Episode I': 'The Phantom Menace',
    'Episode II': 'Attack of the Clones',
    'Episode III': 'Revenge of the Sith', 
    'Episode IV': 'A New Hope',
    'Episode V': 'The Empire Strikes Back',
    'Episode VI': 'Return of the Jedi'
}
for title, subtitle in episodes.items():
    print(title + ': ' + subtitle)
'Episode I': 'The Phantom Menace'
'Episode II': 'Attack of the Clones'
'Episode III': 'Revenge of the Sith'
'Episode IV': 'A New Hope'
'Episode V': 'The Empire Strikes Back'
'Episode VI': 'Return of the Jedi'
S'entraîner aux questions d'entrevue de programmation en Python

Objets moins visuels : range

interval = range(0, 10)

print(interval)
range(0, 10)
for num in interval:
    print(num)
0
1
2
...
9
S'entraîner aux questions d'entrevue de programmation en Python

Objets moins visuels : enumerate

villains = ['Darth Maul', 'Palpatine', 'Darth Vader']
enum_villains = enumerate(villains)
for item in enum_villains:
    print(item)
(0, 'Darth Maul')
(1, 'Palpatine')
(2, 'Darth Vader')
S'entraîner aux questions d'entrevue de programmation en Python

Objets moins visuels : enumerate

villains = ['Darth Maul', 'Palpatine', 'Darth Vader']
enum_villains = enumerate(villains)
for idx, name in enum_villains:
    print(str(idx) + ' - ' + name)
0 - Darth Maul
1 - Palpatine
2 - Darth Vader
S'entraîner aux questions d'entrevue de programmation en Python

Itérables comme arguments

list(), tuple(), set(), etc.

villains = [
    'Darth Maul',
    'Palpatine',
    'Darth Vader'
]
list(enumerate(villains))
[
    (0, 'Darth Maul'),
    (1, 'Palpatine'),
    (2, 'Darth Vader')
]
S'entraîner aux questions d'entrevue de programmation en Python

Itérables comme arguments

list(), tuple(), set(), etc.

villains = [
    'Darth Maul',
    'Palpatine',
    'Darth Vader'
]
list(enumerate(villains))
[
    (0, 'Darth Maul'),
    ...
set(enumerate(villains))
{
    (0, 'Darth Maul'),
    (1, 'Palpatine'),
    (2, 'Darth Vader')
}
S'entraîner aux questions d'entrevue de programmation en Python

Comment savoir si nous avons affaire à un Itérable

interval = range(0, 5)
interval_iter = iter(interval)
print(interval_iter)
<range_iterator object at 0x7f3bdf8ad300>

Itérateur - un objet sachant comment récupérer des éléments consécutifs d'un Itérable un par un

next(interval_iter)
0
next(interval_iter)
1
next(interval_iter)
2
S'entraîner aux questions d'entrevue de programmation en Python

StopIteration

next(interval_iter)
3
next(interval_iter)
4
next(interval_iter)
StopIteration
S'entraîner aux questions d'entrevue de programmation en Python

Décrire une boucle for

droids = ['R2-D2', 'TC-16', 'C-3PO']

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO
iter_droids = iter(droids)

while True: try: except StopIteration: break
S'entraîner aux questions d'entrevue de programmation en Python

Décrire une boucle for

droids = ['R2-D2', 'TC-16', 'C-3PO']

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO
iter_droids = iter(droids)

while True: try: droid = next(iter_droid) print(droid) except StopIteration: break
R2-D2
TC-16
C-3PO
S'entraîner aux questions d'entrevue de programmation en Python

Beaucoup d'Itérables sont des Itérateurs

  • iter()
  • next()

ex. enumerate, finditer etc.

import re
pattern = re.compile(r'[\w\.]+@[a-z]+\.[a-z]+')

text = '[email protected] is the e-mail of John. He often writes to his boss '\
'at [email protected]. But the messages get forwarded to his secretary at [email protected].'

result = re.finditer(pattern, text)
S'entraîner aux questions d'entrevue de programmation en Python

iter() ou next()

iter()

result = re.finditer(pattern, text)

for item in result:
    print(item)
<_sre.SRE_Match object; span=(0, 22), match='[email protected]'>
<_sre.SRE_Match object; span=(77, 93), match='[email protected]'>
<_sre.SRE_Match object; span=(146, 162), match='[email protected]'>
S'entraîner aux questions d'entrevue de programmation en Python

iter() ou next()

next()

result = re.finditer(pattern, text)
next(result)
<_sre.SRE_Match object; span=(0, 22),
match='[email protected]'>
next(result)
<_sre.SRE_Match object; span=(77, 93),
match='[email protected]'>
next(result)
<_sre.SRE_Match object; span=(146, 162),
match='[email protected]'>
S'entraîner aux questions d'entrevue de programmation en Python

Itérables consommables

result = re.finditer(pattern, text)
for item in result:
    print(item)
<_sre.SRE_Match object; ...
<_sre.SRE_Match object; ...
<_sre.SRE_Match object; ...
for item in result:
    print(item)
# nothing
short_list = [2, 4]
for item in short_list:
    print(item)
2
4
for item in short_list:
    print(item)
2
4
S'entraîner aux questions d'entrevue de programmation en Python

Parcourir un DataFrame

pars = {'weight': [168, 183, 198], 'height': [77, 79, 135]}
characters = pd.DataFrame(pars, index=['Luke Skywalker', 'Han Solo', 'Darth Vader'])
print(characters)
                weight  height
Luke Skywalker     168      77
Han Solo           183      79
Darth Vader        198     135
S'entraîner aux questions d'entrevue de programmation en Python

Approche directe

for item in characters:
    print(item)
weight
height
S'entraîner aux questions d'entrevue de programmation en Python

.iterrows()

result = characters.iterrows()
print(result)
<generator object DataFrame.iterrows at 0x7f5dff6b9c50>
S'entraîner aux questions d'entrevue de programmation en Python

.iterrows()

result = characters.iterrows()
for item in result:
    print(item)

item $\rightarrow$ (nom de l'index, Series)

('Luke Skywalker',
weight    168
height     77
Name: Luke Skywalker, dtype: int64)
('Han Solo',
weight    183
height     79
Name: Han Solo, dtype: int64)
('Darth Vader',
weight    198
height    135
Name: Darth Vader, dtype: int64)
S'entraîner aux questions d'entrevue de programmation en Python

.iterrows()

result = characters.iterrows()
for index, series in result:
    print(index)
    print(series)
Luke Skywalker
weight    168
height     77
Name: Luke Skywalker, dtype: int64)
Han Solo
weight    183
height     79
Name: Han Solo, dtype: int64)
Darth Vader
weight    198
height    135
Name: Darth Vader, dtype: int64)
S'entraîner aux questions d'entrevue de programmation en Python

.iteritems()

result = characters.iteritems()
print(result)
<generator object DataFrame.iteritems at 0x7f5dff69f938>
S'entraîner aux questions d'entrevue de programmation en Python

.iteritems()

result = characters.iteritems()
for item in result:
    print(item)

item $\rightarrow$ (nom de la colonne, Series)

('weight',
Luke Skywalker    168
Han Solo          183
Darth Vader       198
Name: weight, dtype: int64)
('height',
Luke Skywalker     77
Han Solo           79
Darth Vader       135
Name: height, dtype: int64)
S'entraîner aux questions d'entrevue de programmation en Python

.iteritems()

result = characters.iteritems()
for name, series in result:
    print(name)
    print(series)
weight
Luke Skywalker    168
Han Solo          183
Darth Vader       198
Name: weight, dtype: int64
height
Luke Skywalker     77
Han Solo           79
Darth Vader       135
Name: height, dtype: int64
S'entraîner aux questions d'entrevue de programmation en Python

À vous de pratiquer !

S'entraîner aux questions d'entrevue de programmation en Python

Preparing Video For Download...