Combiner, compter et itérer efficacement

Rédiger du code Python efficace

Logan Thomas

Scientific Software Technical Trainer, Enthought

Aperçu de Pokémon

  • Dresseurs et dresseuses (collectent des Pokémon)

alt=« Ash Ketchum, l'un des nombreux personnages (appelés dresseurs) du jeu vidéo Nintendo Pokémon »

Rédiger du code Python efficace

Aperçu de Pokémon

  • Pokémon (créatures fictives)

alt=« Carapuce, Pikachu, Bulbizarre et Salamèche : quelques-uns des nombreux Pokémon du jeu vidéo Nintendo »

Rédiger du code Python efficace

Aperçu de Pokémon

  • Pokédex (stocke les Pokémon capturés)

alt=« Pokédex, un outil utilisé par les dresseurs pour stocker les Pokémon capturés »

Rédiger du code Python efficace

Description d'un Pokémon

alt=« Le Pokémon nommé Carapuce avec ses métadonnées »

Rédiger du code Python efficace

Description d'un Pokémon

alt=« Le Pokémon nommé Carapuce avec ses métadonnées, avec les champs Name et Generation en surbrillance »

Rédiger du code Python efficace

Description d'un Pokémon

alt=« Le Pokémon nommé Carapuce avec ses métadonnées, avec les champs Type et Legendary en surbrillance »

Rédiger du code Python efficace

Description d'un Pokémon

alt=« Le Pokémon nommé Carapuce avec ses métadonnées, avec les champs Points de vie, Attaque, Défense, Attaque spéciale, Défense spéciale, Vitesse et Total en surbrillance »

Rédiger du code Python efficace

Combiner des objets

names = ['Bulbasaur', 'Charmander', 'Squirtle']
hps = [45, 39, 44]
combined = []

for i,pokemon in enumerate(names):
    combined.append((pokemon, hps[i]))

print(combined)
[('Bulbasaur', 45), ('Charmander', 39), ('Squirtle', 44)]
Rédiger du code Python efficace

Combiner avec zip

names = ['Bulbasaur', 'Charmander', 'Squirtle']
hps = [45, 39, 44]
combined_zip = zip(names, hps)

print(type(combined_zip))
<class 'zip'>
combined_zip_list = [*combined_zip]

print(combined_zip_list)
[('Bulbasaur', 45), ('Charmander', 39), ('Squirtle', 44)]
Rédiger du code Python efficace

Le module collections

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Types spécialisés de contenants
    • Solutions de rechange aux dict, list, set et tuple généraux
  • À retenir :
    • namedtuple : sous-classes de tuples avec champs nommés
    • deque : conteneur type liste avec ajouts/suppressions rapides
    • Counter : dict pour compter des objets hachables
    • OrderedDict : dict qui conserve l'ordre des entrées
    • defaultdict : dict qui appelle une fabrique pour les valeurs manquantes
Rédiger du code Python efficace

Le module collections

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Types spécialisés de contenants
    • Solutions de rechange aux dict, list, set et tuple généraux
  • À retenir :
    • namedtuple : sous-classes de tuples avec champs nommés
    • deque : conteneur type liste avec ajouts/suppressions rapides
    • Counter : dict pour compter des objets hachables
    • OrderedDict : dict qui conserve l'ordre des entrées
    • defaultdict : dict qui appelle une fabrique pour les valeurs manquantes
Rédiger du code Python efficace

Compter avec une boucle

# Type de chaque Pokémon (720 au total)
poke_types = ['Grass', 'Dark', 'Fire', 'Fire', ...]

type_counts = {}
for poke_type in poke_types: if poke_type not in type_counts: type_counts[poke_type] = 1 else: type_counts[poke_type] += 1
print(type_counts)
{'Rock': 41, 'Dragon': 25, 'Ghost': 20, 'Ice': 23, 'Poison': 28, 'Grass': 64,
 'Flying': 2, 'Electric': 40, 'Fairy': 17, 'Steel': 21, 'Psychic': 46, 'Bug': 65,
 'Dark': 28, 'Fighting': 25, 'Ground': 30, 'Fire': 48,'Normal': 92, 'Water': 105}
Rédiger du code Python efficace

collections.Counter()

# Type de chaque Pokémon (720 au total)
poke_types = ['Grass', 'Dark', 'Fire', 'Fire', ...]

from collections import Counter
type_counts = Counter(poke_types)
print(type_counts)
Counter({'Water': 105, 'Normal': 92, 'Bug': 65, 'Grass': 64, 'Fire': 48,
         'Psychic': 46, 'Rock': 41, 'Electric': 40, 'Ground': 30,
         'Poison': 28, 'Dark': 28, 'Dragon': 25, 'Fighting': 25, 'Ice': 23,
         'Steel': 21, 'Ghost': 20, 'Fairy': 17, 'Flying': 2})
Rédiger du code Python efficace

Le module itertools

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Outils fonctionnels pour créer et utiliser des itérateurs
  • À retenir :
    • Itérateurs infinis : count, cycle, repeat
    • Itérateurs finis : accumulate, chain, zip_longest, etc.
    • Générateurs de combinaisons : product, permutations, combinations
Rédiger du code Python efficace

Le module itertools

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Outils fonctionnels pour créer et utiliser des itérateurs
  • À retenir :
    • Itérateurs infinis : count, cycle, repeat
    • Itérateurs finis : accumulate, chain, zip_longest, etc.
    • Générateurs de combinaisons : product, permutations, combinations
Rédiger du code Python efficace

Combinaisons avec une boucle

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']

combos = [] for x in poke_types: for y in poke_types: if x == y: continue if ((x,y) not in combos) & ((y,x) not in combos): combos.append((x,y))
print(combos)
[('Bug', 'Fire'), ('Bug', 'Ghost'), ('Bug', 'Grass'), ('Bug', 'Water'),
 ('Fire', 'Ghost'), ('Fire', 'Grass'), ('Fire', 'Water'),
 ('Ghost', 'Grass'), ('Ghost', 'Water'), ('Grass', 'Water')]
Rédiger du code Python efficace

itertools.combinations()

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']

from itertools import combinations
combos_obj = combinations(poke_types, 2)
print(type(combos_obj))
<class 'itertools.combinations'>
combos = [*combos_obj]
print(combos)
[('Bug', 'Fire'), ('Bug', 'Ghost'), ('Bug', 'Grass'), ('Bug', 'Water'),
 ('Fire', 'Ghost'), ('Fire', 'Grass'), ('Fire', 'Water'),
 ('Ghost', 'Grass'), ('Ghost', 'Water'), ('Grass', 'Water')]
Rédiger du code Python efficace

Passons à la pratique !

Rédiger du code Python efficace

Preparing Video For Download...