Répétition d'une action

Une légende de l’Inde ancienne raconte que le jeu d’échecs a été inventé par un vieux sage, que son roi voulut remercier en lui affirmant qu’il lui accorderait n’importe quel cadeau en récompense. Le vieux sage demanda qu’on lui fournisse simplement un peu de riz pour ses vieux jours, et plus précisément un nombre de grains de riz suffisant pour que l’on puisse en déposer 1 seul sur la première case du jeu qu’il venait d’inventer, deux sur la suivante, quatre sur la troisième, et ainsi de suite jusqu’à la 64ième case.
Combien de cases peut-on compléter avec 1 000 000 de grains de riz ? Combien de grains nous restera-t-il alors ?

À vous de jouer !

Réponse possible à la première question

Réponse possible à la seconde question
Version avec un affichage si vous le souhaitez

Revenons au problème vu en introduction avec les bidons:

On dispose de deux bidons de contenance 5 galons et 3 galons et d’autant d’eau que l’on souhaite. On cherche à obtenir un bidon contenant 4 galons d’eau. Décrire les actions à réaliser.

Pour rappel, on a déjà écrit les fonctions remplir() (pour remplir le bidon 1), vider() (pour vider le bidon 2) et transvaser() (pour transvaser du bidon 1 vers le bidon 2) qui peuvent être utilisée.

Plus de détails ?

Réaliser la dernière fonction qui lie celles-ci pour finaliser le script qui résout le problème.

Script finalisé

Remarque: vous pouvez vérifier que notre script permet de résoudre le problème avec d’autres contenances pour les deux bidons.

Essayer avec contenance1 = 7, contenance = 5, volume_desire = 3 par exemple ou même pourquoi pas avec des flottants.

Attention, toutefois avec certaines contenances, le problème n’a pas de solution (par exemple avec contenance1 = 4, contenance2 = 2 et volume_desire = 1). Dans ce cas, le programme ne s’arrête pas car la condition d’arrêt dans le while ne sera jamais vérifiée. Donc, c’est à utiliser avec précaution.

La boucle TantQue permet de répéter l’action jusqu’à ce que la condition soit vérifiée.
Il est possible de sortir prématurément d’une telle boucle avec le mot clé break.

Exemple: sortir prématurément d’une boucle TantQue

Vous disposez d’un fichier source que vous souhaitez copier intégralement vers un autre fichier destination. Voici comment on peut procéder en Python:

 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
#!/usr/bin/python3
# -*- coding: utf-8 -*-

#première possibilité:
def copier_fichier1(source, destination):
    """
    Créée une copie du fichier source nommée destination.

    :param source: (file) le fichier de départ
    :param destination: (file) le fichier d'arrivée
    :return: (None)
    :effet de bord: modifie le contenu du fichier destination
    """
    depart = open(source, 'r')  # ouvre en lecture le fichier source
    arrivee = open(destination, 'w')  # ouvre en écriture le fichier destination
                                      # en écrasant son contenu au fur et à mesure
    while True:  # permet de répéter indéfiniment les actions suivantes
        txt = depart.read(50)  # lit les 50 caractères suivants l'endroit
                               # où on est arrivé dans la lecture de depart
                               # txt forme une chaîne de caractères appelée string
        if txt == "":  # teste si la chaîne lue est vide, cela arrive si l'on est
                       # à la fin du fichier.
            break  # permet de sortir immédiatement de la boucle while
        arrivee.write(txt)  # écrit la chaîne lu dans le fichier arrivee
    depart.close()
    arrivee.close()

#seconde possibilité:
def copier_fichier2(source, destination):
    """
    Créée une copie du fichier source nommée destination.

    :param source: (file) le fichier de départ
    :param destination: (file) le fichier d'arrivée
    :return: (None)
    :effet de bord: modifie le contenu du fichier destination
    """
    with open(source, 'r') as depart, open(destination, 'w') as arrivee:
        while True:  # permet de répéter indéfiniment les actions suivantes
            txt = depart.read(50)  # lit les 50 caractères suivants l'endroit
                                   # où on est arrivé dans la lecture de depart
                                   # txt forme une chaîne de caractères appelée string
            if txt == "":  # teste si la chaîne lue est vide, cela arrive si l'on
                           # est à la fin du fichier.
                break  # permet de sortir immédiatement de la boucle while
            arrivee.write(txt)  # écrit la chaîne lu dans le fichier arrivee

Vous pouvez le tester. Il suffira d’ajouter dans le script ou dans la console (après l’exécution du script):

1
2
copier_fichier1("nom_du_fichier_a_copier", "nom_de_la_copie")  # notez la présence 
# des guillemets lors de l'appel aux noms des fichiers

ou

1
2
copier_fichier2("nom_du_fichier_a_copier", "nom_de_la_copie")  # notez la présence 
# des guillemets lors de l'appel aux noms des fichiers

Dans le langage Python, encore de nouveaux types de données: string, file

Langage courant Python Fonctions liées
Chaîne de caractères str (string) str()
Fichier file open(), close()

On approfondira leurs usages dans de prochains chapitres.