• Home
    • Home
    • Wouf's Blog
    • Bibliowouf
    • Boutique TShirt
    • Sponsoring
    • Politique de confidentialié
  • Math
    • Math au collège
    • Applis et boutiques
    • Cours particuliers
  • Jeux
    • Echecs
    • Poker
    • Des chiffres et des lettres
    • Dogs and cats (mastermind)
    • boggle - version Anglaise
    • boggle - version Française
  • Info
    • Console Python
    • SVG EDIT
    • fond d'écran
    • Prénom en chinois
    • Boite à outils
    • Mes Logiciels
    • DIVERS
    • Webmaster?
    • Liens

Laurent Petitprez

Tweet

Les conseils de Wouf

Beaucoup d’élèves entrant au lycée ont en effet des difficultés à manipuler les fractions, les racines carrées, les puissances, à factoriser des expressions… Ces notions, apprises au collège, sont mal assimilées, et le programme des classes de lycée ne prévoit pas de les retravailler en profondeur.

Cet ouvrage propose une remédiation pas à pas. Un code simple et mnémotechnique est associé à chacune des règles et rappelé dans toutes les corrections d’exercices. Il permet de se repérer et de comprendre ses erreurs.

L'amour, c'est un sport. Surtout s'il y en a un des deux qui veut pas.

Jean Yanne (sur Mon tshirt!)

Voir toutes les citations.


Algorithme au cycle 4 - Séquence 2

Mon premier programme : bonjour.py

Ll'IDLE est une interface de communication avec Python, et rien de plus.

L'étape suivante consiste en la création d'un répertoire mesprog (clic droit – Nouveau dossier). Ce répertoire contiendra tous les projets Python que nous développerons cette année. Dans un collège (sous kwartz) pour que ce dossier soit bien sauvegardé, il doit être dans votre H:/travail !
Dans ce dossier il nous faut créer un Nouveau document texte (Clic droit - Nouveau document texte) et l'appeler bonjour.py. Seule l'extension .py est importante. Avant le point on choisit en général un nom qui évoque le programme !
On peut choisir de l'appeler monprog.py, cela fonctionne mais avouez que ce nom n'est pas très parlant !

Sur ce fichier un clic droit nous offre une nouvelle option Edit with Idle

Dans ce fichier on entre :

print(" Bonjour monde !")

Remarque d'élève intéressante : Python ne répond pas les chevrons habituels (>>>)

Dans le menu supérieur RUN ! -Run module (F5)-

C'est dans l'IDLE que Python lance notre petit programme !

Une autre façon de lancer le programme est le double clic sur monprog.py. Une fenêtre noire s'ouvre et se ferme rapidement et certains yeux rapides perçoivent le "Bonjour Monde !".

Mais le programme qui est terminé après la seule instruction d'affichage se ferme vraiment très très vite !

2. Deuxième variante

Code Python traduit en HTML:
print("Bonjour monde"  )
mavariable=input()

bonjour.py

Cette fois ci la fenêtre reste affichée.

La deuxième ligne de notre code attend simplement que l’utilisateur entre quelque chose au clavier que Python rangera dans la variable mavariable…

D’ailleurs, si on appuie sur ENTREE la fenêtre se ferme !

Remarque

Ouvrons à nouveau ce ficher dans l'IDLE, exécutons le (F5) et avant d'appuyer sur ENTREE écrivez simplement coucou :

A l' invite Python >>>, demandez donc à Python d'afficher le contenu de la variable mavariable -print(mavariable)- et sans surprise Python affichera coucou!

Programme : la table de N : Pseudo code

Etudions le logigramme suivant

Et le pseudo code associé:

Debut Table de N
demander nombre N
i=1
tq i inferieur à 10
afficher i x N
i = i+1
fin_tq
Fin Table de N
  • Cet algorithme demande à l'utilisateur d'entrer un nombre au clavier (stocké dans la variable N)
  • Il initialise la variable i avec la valeur 1
  • Tant que la valeur de cette variable est inférieure strictement à 10 :
    • Il affiche la valeur du produit de i et N
    • Il incrémente i (la variable i contient la valeur de i + 1)

Ce petit programme affiche donc les résultats de la table de N

En Python cela donne :

Code Python traduit en HTML:
n =input("Entrer un nombre :" )
i=1
while i<10:
    print(i*int(n))
    i=i+1

Explication du code

En première ligne la fonction input provoque une interruption dans le programme courant. L'utilisateur est invité à entrer des caractères au clavier et à terminer avec . Lorsque cette touche est enfoncée, l'exécution du programme se poursuit, la chaine de caractères est alors assignée à la variable n.

En deuxième ligne la valeur 1 est assignée à la variable i

En troisième ligne : En anglais " while " signifie "Tant que"... Le contenu qui suit, indenté (décallé de 4 caractères) est le contenu de cette boucle.

  • print(i*int(n)) : affiche (i*int(n))
  • La valeur de i+1 est assignée à la variable i

La fonction int()

L'entrée au clavier faite par l'utilisateur est une cahine de caractère : int() permet de la transformer en nombre entier

A l'execution, un essai avec le nombre 5 donne :

Votre mission

1. Dans un fichier table1.py, copiez-collez ce code, essayez le, modifiez le pour être sûrs de l'avoir bien compris.

2. Débrouillez-vous pour que vos modifications permettent d'arriver au résultat suivant :

Indice :

Dans l'idle, aussi appelé interpreteur, essayez print("2","+","5","=",2+5)

Un travail pour les plus rapides

Seul ou à plusieurs, développez un script Python (les_tables.py) qui écrive toutes les tables de multiplications de 1x1=1 à 9x9=81

Officiel

Au cycle 4, les élèves s'initient à la programmation, en développant dans une démarche de projet quelques programmes simples, sans viser une connaissance experte et exhaustive d'un langage ou d'un logiciel particulier. En créant un programme, ils développent des méthodes de programmation, revisitent les notions de variables et de fonctions sous une forme différente, et s'entraînent au raisonnement.

Attendus de fin de cycle

  • Écrire, mettre au point et exécuter un programme simple

Connaissances et compétences associées

Décomposer un problème en sous-problèmes afin de structurer un programme ; reconnaître des schémas. Écrire, mettre au point (tester, corriger) et exécuter un programme en réponse à un problème donné. Écrire un programme dans lequel des actions sont déclenchées par des événements extérieurs. Programmer des scripts se déroulant en parallèle. - Notions d'algorithme et de programme. - Notion de variable informatique. - Déclenchement d'une action par un événement, séquences d'instructions, boucles, instructions conditionnelles.

Exemples de situations, d'activités et de ressources pour l'élève

Jeux dans un labyrinthe, jeu de Pong, bataille navale, jeu de nim, tic tac toe. Réalisation de figure à l'aide d'un logiciel de programmation pour consolider les notions de longueur et d'angle. Initiation au chiffrement (Morse, chiffre de César, code ASCII...). Construction de tables de conjugaison, de pluriels, jeu du cadavre exquis... Calculs simples de calendrier. Calculs de répertoire (recherche, recherche inversée...). Calculs de fréquences d'apparition de chaque lettre dans un texte pour distinguer sa langue d'origine : français, anglais, italien, etc.

Repères de progressivité:

En 5e, les élèves s'initient à la programmation événementielle. Progressivement, ils développent de nouvelles compétences, en programmant des actions en parallèle, en utilisant la notion de variable informatique, en découvrant les boucles et les instructions conditionnelles qui complètent les structures de contrôle liées aux événements.

Liens
  • python.org Le site officiel, pour télécharger Python !
  • Apprenez à programmer en Python avec Openclassrooms
  • Un programme Python pour publier du code Python sur une page web
  • logigramme_svg, utilitaire de transcription de pseudo code en logigramme
  • Wikibooks : Le module Turtle
  • A la découverte de Turtle sur zestedesavoir.com
  • snakify : La boucle for
  • ARCHIVES

Travaux d'élèves :

La page dédiée
Téléchargemments

Robot Blue-Bot Robot Blue-Bot

Blue-Bot est un robot autonome spécialement conçu pour une utilisation scolaire. Le robot : 125,00 €Pack 6 robots + station d'accueil : 759,00 €

Autres robots pédagogiques

  • La page officiel pour télécharger la dernière version de Python
 


Tweets by wouf

Comment ???

NEWS

  • Page : https://site2wouf.fr/algorithme2022-2023_s2.php
  • Catégorie : Non définie

Des Mathématiques combinatoires avec Python et itertools.combinations

Des Mathématiques combinatoires avec Python et itertools.combinations

En Mathématiques, “choisir” sans tenir compte de l’ordre, c’est la combinaison. En Python, c’est exactement ce que fait itertools.combinations : il énumère toutes les sélections possibles de taille k parmi une liste, sans doublon, et sans permutation inutile. Résultat : du code plus clair, plus sûr… et souvent plus rapide que des boucles bricolées.

Une combinaison de taille p parmi n objets, c’est un choix sans ordre.

  • {A, B, C} et {C, B, A} représentent la même combinaison.
  • Le nombre de choix possibles est le coefficient binomial :  [katex]C_n^p[/katex]

[katex]C_n^p[/katex], souvent écrit [katex]\binom{n}{p}[/katex] dans la littérature anglo-saxonne et en informatique.

[katex]C_n^p[/katex] se lit : « p parmi n »

Cela désigne le nombre de combinaisons de p éléments choisis parmi n, sans tenir compte de l’ordre.

itertools.combinations ne renvoie pas une liste : c’est un itérateur

Lorsque l’on utilise itertools.combinations, il est tentant de penser que la fonction renvoie immédiatement une liste contenant toutes les combinaisons possibles. Ce n’est pas le cas. L’appel :

from itertools import combinations
comb = combinations([1, 2, 3, 4], 2)

ne construit pas en mémoire toutes les paires possibles. Il renvoie un objet itérateur, c’est-à-dire un objet capable de produire les combinaisons au fur et à mesure, uniquement lorsqu’elles sont demandées.

Si l’on affiche directement l’objet :

print(comb)

Python renvoie quelque chose comme :

>>> # script executed
<itertools.combinations object at 0x1164f90>
>>> 
 

Tester dans le Bac à sable Python!

Cela signifie que l’on dispose d’un générateur de combinaisons, et non d’une collection déjà matérialisée.


Pourquoi un itérateur et non une liste ?

Ce choix n’est pas anodin. Il est directement lié à la nature combinatoire du problème.

Le nombre de combinaisons de p éléments parmi n est donné par
[katex]C_n^p[/katex].

Or cette quantité peut devenir extrêmement grande lorsque nnn augmente. Générer toutes les combinaisons et les stocker en mémoire pourrait devenir coûteux, voire impossible.

Un itérateur adopte une stratégie dite lazy (évaluation paresseuse) :

  • une combinaison est calculée,
  • elle est transmise au programme,
  • puis la suivante est calculée uniquement si nécessaire.

Ainsi, la mémoire utilisée reste minimale.


Conséquence pratique : parcours progressif

L’utilisation naturelle d’un objet combinations se fait dans une boucle :

from itertools import combinations
Logigramme fabriqué avec LOGIGW
from itertools import combinations

for a, b in combinations([1, 2, 3, 4], 2):
    print(a, b)

Les paires sont produites successivement. À aucun moment l’ensemble des combinaisons n’est stocké dans une liste complète.

Cette approche présente un avantage important : si l’on cherche une combinaison vérifiant une condition donnée, il est possible d’interrompre le parcours dès que le résultat est trouvé :

from itertools import combinations

nums = [2, 7, 11, 15, 3, 6]
for a, b in combinations(nums, 2):
    if a + b == 9:
        print(a, b)
        break

Dans ce cas, seules les combinaisons nécessaires sont générées.


⚠ Un itérateur se consomme

Un point essentiel doit être souligné : un itérateur ne peut être parcouru qu’une seule fois.

from itertools import combinations

c = combinations([1, 2, 3, 4], 2)

print(list(c))   # première conversion
print(list(c))   # seconde conversion

La seconde conversion renverra une liste vide. L’itérateur a été “épuisé” lors du premier parcours.

Tester dans le Bac à sable Python!

Si plusieurs parcours sont nécessaires, il convient soit de recréer l’itérateur, soit de convertir explicitement le résultat en liste — à condition que le volume de données reste raisonnable :

pairs = list(combinations([1, 2, 3, 4], 2))

Itérateur et combinatoire : une cohérence conceptuelle

Il existe une cohérence profonde entre la notion mathématique de combinaison et l’implémentation choisie par Python.

Le coefficient combinatoire [katex]C_n^p[/katex] peut croître très rapidement. En conséquence, une approche “en flux” est souvent plus pertinente qu’une approche fondée sur le stockage intégral des résultats.

itertools.combinations ne fournit donc pas une liste prête à l’emploi, mais un mécanisme de génération contrôlée. Ce choix reflète une philosophie plus large de Python : privilégier l’efficacité mémoire et la modularité des traitements.

Exemple : générer les mains de poker sans itertools (version lourde)

Au Texas Hold'em No Limit, vous recevez 2 cartes privatives.

Supposons que l’on représente le paquet par les entiers de 0 à 51.

Sans itertools, on peut écrire deux boucles imbriquées pour représenter ces cartes privatives possibles :

deck = list(range(52))

hands = []

for i in range(len(deck)):
    for j in range(i + 1, len(deck)):
        hands.append((deck[i], deck[j]))

print(len(hands))  # 1326

Tester dans le Bac à sable Python!

Ici :

Ici :

  • toutes les 1326 mains sont construites,
  • elles sont stockées dans la liste hands,
  • la mémoire contient simultanément toutes les combinaisons.

Cette méthode fonctionne, mais :

  • elle construit explicitement la liste complète,
  • elle demande d’écrire la logique d’évitement des doublons (j = i + 1),
  • elle devient très lourde si le nombre de cartes augmente (5 cartes par exemple).
itertools.combinations et mains privatives au poker holdhem

Version avec itertools.combinations (version légère)

La même opération peut s’écrire :

from itertools import combinations

deck = range(52)

for hand in combinations(deck, 2):
    print(hand)

Différence fondamentale :

  • aucune liste complète n’est créée,
  • chaque main est produite une par une,
  • la mémoire reste minimale.

Si l’on souhaite simplement connaître le nombre total :

count = 0
for _ in combinations(deck, 2):
    count += 1

print(count)  # 1326

Le résultat est identique, mais sans stockage massif.


Pourquoi la différence devient spectaculaire avec 5 cartes

Pour une main complète de 5 cartes :

[katex]C_{52}^5[/katex]

soit 2 598 960 combinaisons.

La version “lourde” devrait créer une liste contenant plus de 2,5 millions de tuples :

hands = list(combinations(range(52), 5))

Cela représente plusieurs dizaines de mégaoctets en mémoire.

En revanche, l’itérateur :

for hand in combinations(range(52), 5):
    # analyse statistique
    pass

ne conserve qu’une seule combinaison à la fois.


En résumé

Sans itertools :

  • on construit explicitement toutes les mains,
  • on les stocke,
  • la mémoire croît avec le nombre de combinaisons.

Avec itertools.combinations :

  • on délègue la génération à un itérateur,
  • les mains sont produites à la demande,
  • la mémoire reste stable, même lorsque le nombre de combinaisons explose.

Dans un contexte combinatoire comme le poker, où les quantités passent rapidement de 1326 à plusieurs millions, cette différence n’est pas anecdotique : elle est structurelle.

Personnellement :

La première fois que j’ai utilisé itertools.combinations — encore avec une certaine hésitation — c’était lors de la génération des mains pour l'a page'application Poker Training de site2wouf.fr.

À ce moment-là, l’objectif était simplement pratique : produire proprement toutes les mains possibles sans écrire des boucles imbriquées interminables. Ce n’est qu’ensuite que la portée conceptuelle est devenue évidente. Derrière une ligne de code concise se cachait une idée mathématique ancienne : la combinatoire.

Ce qui paraissait être un simple outil Python révélait en réalité une cohérence profonde entre la théorie et l’implémentation. Générer des mains de poker revient exactement à parcourir les [katex]C_{52}^2[/katex] combinaisons possibles. Python ne faisait que traduire, de manière élégante, une formule déjà connue.

Avec un peu de recul, cette première utilisation a marqué un déclic : combinations n’est pas seulement pratique, il incarne une manière plus rigoureuse de penser les problèmes. Plutôt que de “fabriquer des listes”, il invite à raisonner en termes de génération contrôlée, de flux, et d’efficacité.

C’est précisément là que les mathématiques et la programmation cessent d’être deux mondes distincts pour devenir deux expressions d’une même idée.

Quand la mécanique masque l’idée

Imaginons que l’on souhaite former tous les groupes possibles de 3 élèves parmi une classe de 20.

itertools.combinations et groupe de 3 élèves
students = [
    "Alice", "Mohamed", "Sofia", "Lucas", "Yuki",
    "Amina", "Ethan", "Fatou", "Mateo", "Inès",
    "Noah", "Lina", "Arjun", "Chloé", "Ibrahim",
    "Maya", "Diego", "Leïla", "Hugo", "Zara"
]

groups = []

for i in range(len(students)):
    for j in range(i + 1, len(students)):
        for k in range(j + 1, len(students)):
            groups.append((students[i], students[j], students[k]))

print(len(groups))

Tester dans le Bac à sable Python!

Ce programme fonctionne.

Mais plusieurs éléments apparaissent immédiatement :

  • la structure repose sur trois boucles imbriquées ;
  • les prénoms ne sont jamais manipulés directement ;
  • le code parle d’indices (i, j, k) plutôt que d’élèves.

Autrement dit, la mécanique de parcours prend le pas sur l’idée mathématique.

Et si l’on décide de former des groupes de 4 élèves, il faut ajouter une quatrième boucle.
La structure du code devient dépendante de la profondeur combinatoire.


La version abstraite

Avec itertools.combinations, la même idée s’écrit :

from itertools import combinations

students = [
    "Alice", "Mohamed", "Sofia", "Lucas", "Yuki",
    "Amina", "Ethan", "Fatou", "Mateo", "Inès",
    "Noah", "Lina", "Arjun", "Chloé", "Ibrahim",
    "Maya", "Diego", "Leïla", "Hugo", "Zara"
]

groups = combinations(students, 3)

print(len(list(groups)))

Tester dans le Bac à sable Python!

1140 combinaisons

Ici :

  • aucune boucle imbriquée n’apparaît ;
  • aucun indice n’est manipulé ;
  • l’intention est explicite : “choisir 3 élèves parmi 20”.

Mathématiquement, le nombre de groupes possibles est :

[katex]C_{20}^3[/katex]

soit 1140 combinaisons.

La structure du code ne change pas si l’on passe à 4 élèves :

groups = combinations(students, 4)

Seul le paramètre varie.
La mécanique reste identiqu...

lien vers l'article sur wouf blog
 

TIPS

Vous cherchez un logiciel gratuit?

Framasoft
est joignable en cliquant sur "Liens" puis sur "Plus".

Voir tous les conseils.

Dernière mise à jour:

Juillet-aôut 2023

Nouvelle Page !

  • Exercices du jour : Les 16 immeubles !

Pages modifiées (ou corrigées) !

  • Exercices du jour : L'enclos
  • Exercices du jour : Les carrelages de couleur /a>

Voir toutes les mises à jour.

 

Trois liens disponibles !

Votre propre message ici, c'est possible! Plus d'informations



Sauf mention contraire, le site est placé sous double licence Creative Commons et GNU Free Documentation License, par contre les grandes images décoratives appartiennent à Corbis et sont licenciées par microsoft

Contact: w0uf@free.fr (avec un zéro à la place du O)