Combiner, compter et itérer efficacement

Écrire du code Python efficace

Logan Thomas

Scientific Software Technical Trainer, Enthought

Aperçu Pokémon

  • Dresseurs (capturent des Pokémon)

alt=”Ash Ketchum; one of the many characters (called trainers) in the Nintendo video game Pokémon”

Écrire du code Python efficace

Aperçu Pokémon

  • Pokémon (personnages animaliers fictifs)

alt=”Squirtle, Pikachu, Bulbasaur, and Charmander; a few of the many Pokémon that exist in the Nintendo video game”

Écrire du code Python efficace

Aperçu Pokémon

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

alt=”Pokédex, a tool used by trainers to store captured Pokémon”

Écrire du code Python efficace

Description Pokémon

alt=”The Pokémon named Squirtle along with its accompanying metadata”

Écrire du code Python efficace

Description Pokémon

alt=”The Pokémon named Squirtle along with its accompanying metadata and the Name and Generation field highlighted”

Écrire du code Python efficace

Description Pokémon

alt=”The Pokémon named Squirtle along with its accompanying metadata and the Type and Legendary field highlighted”

Écrire du code Python efficace

Description Pokémon

alt=”The Pokémon named Squirtle along with its accompanying metadata and the Health Points, Attack, Defense, Special Attack, Special Defense, Speed, and Total fields highlighted”

Écrire 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)]
Écrire du code Python efficace

Combiner des objets 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)]
Écrire du code Python efficace

Le module Collections

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Types de données de conteneurs spécialisés
    • Alternatives aux types généraux dict, list, set et tuple
  • À noter :
    • namedtuple : sous-classes de tuples avec champs nommés
    • deque : conteneur de type liste permettant d'ajouter et de supprimer rapidement des éléments
    • Counter : dictionnaire pour le comptage d'objets hachables
    • OrderedDict : dictionnaire qui conserve l'ordre des entrées
    • defaultdict : dictionnaire qui fait appel à une fonction d'usine pour fournir les valeurs manquantes
Écrire du code Python efficace

Le module Collections

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Types de données de conteneurs spécialisés
    • Alternatives aux types généraux dict, list, set et tuple
  • À noter :
    • namedtuple : sous-classes de tuples avec champs nommés
    • deque : conteneur de type liste permettant d'ajouter et de supprimer rapidement des éléments
    • Counter : dictionnaire pour le comptage d'objets hachables
    • OrderedDict : dictionnaire qui conserve l'ordre des entrées
    • defaultdict : dictionnaire qui fait appel à une fonction d'usine pour fournir les valeurs manquantes
Écrire du code Python efficace

Compter avec une boucle

# Each Pokémon's type (720 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}
Écrire du code Python efficace

collections.Counter()

# Each Pokémon's type (720 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})
Écrire du code Python efficace

Le module itertools

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Outils fonctionnels pour la création et l'utilisation d'itérateurs
  • À noter :
    • Itérateurs infinis : count, cycle, repeat
    • Itérateurs finis : accumulate, chain, zip_longest, etc.
    • Générateurs combinés : product, permutations, combinations
Écrire du code Python efficace

Le module itertools

  • Fait partie de la bibliothèque standard de Python (module intégré)
  • Outils fonctionnels pour la création et l'utilisation d'itérateurs
  • À noter :
    • Itérateurs infinis : count, cycle, repeat
    • Itérateurs finis : accumulate, chain, zip_longest, etc.
    • Générateurs combinés : product, permutations, combinations
Écrire du code Python efficace

Combinaisons avec 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')]
Écrire 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')]
Écrire du code Python efficace

Passons à la pratique !

Écrire du code Python efficace

Preparing Video For Download...