5. ALEAS ET MAITRISE DES DETAILS /1

5.1. Modules: le module random

De quoi générer des nombres pseudo-aléatoires:

import random

x = random.randrange(4)
y = random.randrange(10,14)

La fonction randrange correspond à un tirage au hasard dans la liste d’entiers qui serait générée par la fonction range avec les mêmes paramètres. Par exemple range(4) génère la liste [0,1,2,3] et random.randrange(4) tire un élément au hasard dans la liste [0,1,2,3].

Warning

Le module random contient une fonction randint qui a un paramètrage différent. L’appel random.randint(min,max) effectue un tirage aléatoire d’un entier entre min et max inclus.

Pour tirer un flottant entre 0 (inclus) et 1 (exclu) utiliser: x = random.random()

5.2. Sorties: print sans retour à la ligne et print formaté

Pour éviter le retour en début de ligne suivante après un print, il faut ajouter une virgule en bout de l’instruction print. Exemple:

print 'x vaut', x, 'z vaut',
print z

dans ce cas une seule ligne sera affichée, et le retour en début de ligne suivante sera effectué seulement après l’affichage de la valeur de z.

Grâce aux chaînes de formatage il est possible de spécifier le format des éléments lors de leur conversion en chaînes de caractères, en vue par exemple de les afficher avec un print. L’opérateur % est utilisé pour cela (ici % n’est plus l’opérateur permettant d’obtenir le reste d’une division entière).

Voici par exemple comment afficher le contenu d’une variable y contenant un flottant avec arrondi à 2 décimales:

chaine = '%.2f' % y
print chaine

Le .2f signifie que l’on souhaite la conversion d’un nombre flottant avec un arrondi à 2 décimales.

Warning

Dans cette exemple la valeur obtenue dans la variable chaine n’est plus un nombre flottant, c’est une chaîne de caractères. Si l’on calcule alors chaine + chaine, on n’effectue pas l’addition de deux nombres mais une concaténation de chaînes.

L’arrondi ci-dessus peut se faire directement dans un print avec:

print '%.2f' % y

Il est bien sûr possible de mélanger ceci avec les autres possibilités de print. Exemples:

print 'y vaut', '%.2f' % y, 'et z vaut', '%.2f' % z

Ce type de formatage présente de nombreuses autres possibilités et options, que l’on trouvera dans la documentation Python, comme par exemple l’affichage dans un champ de taille fixe:

print 'print:'
z = 300
print '%5d' % z
y = 6.728
print '%8.2f' % y

L’affichage obtenu est alors:

print:
  300
    6.73

La valeur entière (code de format d) 300 a été écrite justifiée à droite dans une zone de 5 caractères (c’est à dire deux espaces suivis du nombre 300), puis le flottant (code de format f) 6.728 a été arrondi à 2 décimales et affiché justifié à droite dans une zone de 8 caractères (c’est à dire 4 espaces suivis du nombre 6, suivi du point et suivi de 73). De tels formatages sont utilisés notamment pour présenter des nombres alignés en colonnes.

Par exemple:

print 'alignement:'
z = 12.3456
print '%8.2f' % z
y = 6.728
print '%8.2f' % y

donne à l’affichage:

alignement:
   12.35
    6.73

5.3. Structure de contrôle: sortie de boucle anticipée avec break

Il est possible de forcer la fin d’une boucle avec l’instruction break. Le programme suivant affiche le plus petit entier dont le carré est supérieur (strictement) à 437:

for i in range(437):
  if i*i > 437:
    break
  print "le carré de", i, "n'est pas plus grand que 437"

print i, 'est le plus petit entier dont le carré est plus grand que 437'

Note

L’instruction break n’est pas forcément la dernière des instructions écrites dans la boucle, mais si elle est exécutée elle entraine immédiatement la sortie de la boucle, et l’exécution se poursuit après la boucle.

5.4. Types: conversions entre types

Exemple de conversion du type chaîne vers les types numériques entier (integer en anglais) et flottant (float):

chaine = "1234"
y = int(chaine) # y contient un entier
x = float("1.5") # x contient un flottant

Et des types numériques vers le type chaîne (string):

a = str(1234)
chaine = "un nombre à 6 chiffres: " + a
x = 4.57
autreChaine = str(x)
encoreUne = str(3+2j)

Lorsqu’une chaîne contient un seul caractère, on peut obtenir le code ASCII du caractère sous la forme d’un entier:

uneLettre = 'b'
codeASCII = ord(uneLettre)

La fonction chr permet de générer le caractère à partir de son code ASCII:

uneLettre = chr(codeASCII)

Enfin il est possible d’effectuer des conversions entre entiers et flottants. Ici y est un entier, mais x est un flottant:

y = 2
x = float(y)
print x

et on obtient 2.0 à l’écran.

Là c’est le contraire, y est un flottant et x est un entier:

y = 3.9999999
x = int(y)
print x

et le programme affiche alors 3 (cette conversion a supprimé les décimales, sans faire d’arrondi).

5.5. (AV) Nombres: notation octale et hexadécimale

Les nombres peuvent être spécifiés dans d’autres bases que la base 10:

  • Notation hexadécimale (base 16): préfix 0x ou 0X
  • Notation octale (base 8): préfix 0

Exemples:

0xFF donne 255

012 + 1 donne 11 (12 en octal plus 1 en décimal donne 11 en décimal)

Note

Pour obtenir une chaîne contenant la représentation hexadécimale ou octale d’un nombre y utiliser respectivement hex(y) et oct(y).