Académique Documents
Professionnel Documents
Culture Documents
Informations complémentaires :
1 RESSOURCES ET RÉFÉRENCES
Apprendre à programmer avec Python", Gérard Swinnen, en téléchargement libre à partir du site
http://inforef.be/swi/python.htm
https://www.python.org/
https://docs.python.org/3/tutorial/
2 PRÉSENTATION
2.1 Qu’est Python ?
Un langage de haut niveau et multi-paradigmes (programmation impérative, orientée objet,
fonctionnelle)
Portable
Interprété
Doté d’un typage fort , dynamique et implicite
Relativement orthogonal (utilise un petit nombre de concepts de base)
Utilisant des références (pas de pointeurs de bas niveau) et disposant d’un « garbage collector »
Proposant des types de données évolués (tuples, listes, dictionnaires, ensembles, …)
Doté d’un mécanisme de gestion des exceptions
Gratuit
3 PRÉLIMINAIRES
Les (fins de) lignes de commentaire commencent par : #
La première ligne devrait ressembler à : #!/usr/bin/env python3
Il est conseillé d’utiliser l’extension py pour les scripts Python.
Les fichiers sources doivent être encodés en UTF-8
On peut obtenir de l’aide avec :
o help() dans le shell interactif de python
o Un client http ( « browser ») et aller sur le site https://www.python.org/
o Les fichiers d’aide locaux (par exemple activepython34.chm)
>>> z is x
True
>>> x=x+1
>>> x
2.2
>>> z
1.2
>>> len(x)
4
>>> 0 in x
True
>>> 'zero' in x
False
>>> x.add(5)
>>> x
{'trois', 0, 2, 5, 'un'}
>>> x.remove(2) L’élément 2 !
>>> x
{'trois', 0, 5, 'un'}
>>> x.pop() Retire et renvoie un élément « au hasard ».
'trois'
>>> x
{0, 5, 'un'}
>>> x.clear()
>>> x
set()
>>> x={'one': 'un', 2 : 'deux', 'three' : Les dictionnaires sont des séquences
3} modifiables où les « indices » (les clés)
>>> x ne sont pas forcément des entiers.
{'three': 3, 'one': 'un', 2: 'deux'} A chaque clé correspond une valeur.
>>> type(x) Les clés doivent être de type non
<class 'dict'> modifiable.
>>> len(x)
3
>>> 2 in x
True
>>> 'deux' in x C’est la clé qui est testée !
False
>>> x['one']
'un'
>>> x['one']='uno' Modification de la valeur associée
>>> x à la clé.
{'three': 3, 'one': 'uno', 2: 'deux'}
>>> x[4]='uno' Ajoute la paire clé-valeur si la clé
>>> x n’est pas présente.
{'three': 3, 'one': 'uno', 2: 'deux', 4:
'uno'}
>>> x[5] Cette clé ,est pas présente dans le dico !
Introduction à la programmation Python
HE2B - ISIB 2022/2023 ÉLECTRONIQUE & INFORMATIQUE II - Laboratoire de techniques informatiques 1 - J.M. Mattens 8
123
>>> abs(-1.2)
1.2
>>> dir('abc') Renvoie des « noms » associés à l’objets.
['__add__', '__class__', '__contains__',
'__delattr__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__',
'__getnewargs__', '__gt__', '__hash__',
'__init__', '__iter__', '__le__',
'__len__', '__lt__', '__mod__', '__mul__',
'__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__',
'capitalize', 'casefold', 'center',
'count', 'encode', 'endswith',
'expandtabs', 'find', 'format',
'format_map', 'index', 'isalnum',
'isalpha', 'isdecimal', 'isdigit',
'isidentifier', 'islower', 'isnumeric',
'isprintable', 'isspace', 'istitle',
'isupper', 'join', 'ljust', 'lower',
'lstrip', 'maketrans', 'partition',
'replace', 'rfind', 'rindex', 'rjust',
'rpartition', 'rsplit', 'rstrip', 'split',
'splitlines', 'startswith', 'strip',
'swapcase', 'title', 'translate', 'upper',
'zfill']
>>> dir(str)
['__add__', '__class__', '__contains__',
'__delattr__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__',
'__getnewargs__', '__gt__', '__hash__',
'__init__', '__iter__', '__le__',
'__len__', '__lt__', '__mod__', '__mul__',
'__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__',
'capitalize', 'casefold', 'center',
'count', 'encode', 'endswith',
'expandtabs', 'find', 'format',
'format_map', 'index', 'isalnum',
'isalpha', 'isdecimal', 'isdigit',
'isidentifier', 'islower', 'isnumeric',
'isprintable', 'isspace', 'istitle',
'isupper', 'join', 'ljust', 'lower',
'lstrip', 'maketrans', 'partition',
'replace', 'rfind', 'rindex', 'rjust',
'rpartition', 'rsplit', 'rstrip', 'split',
'splitlines', 'startswith', 'strip',
'swapcase', 'title', 'translate', 'upper',
'zfill']
>>> divmod(27,5)
(5, 2)
>>> help(divmod) Aide dans le shell.
Help on built-in function divmod in module
builtins:
divmod(...)
divmod(x, y) -> (div, mod)
>>> max(1,2,3,2,1)
3
>>> min(4,3,2,1)
1
>>> round(3.567)
4
>>> round(3.567,2)
3.57
>>>
>>> import math Pour employer un module, il faut
l’importer.
>>> math.sin(math.pi/6.0)
0.49999999999999994
>>> import math as m
>>> m.sin(m.pi/6.0)
0.49999999999999994
>>> from math import pi,sin
>>> sin(pi/6.0)
0.49999999999999994
>>> from math import * NE PAS FAIRE CELA CAR :
- ne permet pas de savoir la provenance
des éléments utilisés,
- peut cacher des éléments existants qui
ont le même nom
- peut provoquer des collisions de noms
- rend le code difficile à debugger quand
un symbole est indéfini
>>> dir(math)
['__doc__', '__loader__', '__name__',
'__package__', '__spec__', 'acos', 'acosh',
'asin', 'asinh', 'atan', 'atan2', 'atanh',
'ceil', 'copysign', 'cos', 'cosh',
'degrees', 'e', 'erf', 'erfc', 'exp',
'expm1', 'fabs', 'factorial', 'floor',
'fmod', 'frexp', 'fsum', 'gamma', 'hypot',
'isfinite', 'isinf', 'isnan', 'ldexp',
'lgamma', 'log', 'log10', 'log1p', 'log2',
'modf', 'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
>>>
>>>exit() Fin du shell python
5 PREMIERS SCRIPTS
5.1 prog1.py
Le script :
#!/usr/bin/env python3
"""
Calcule la somme des deux nombres flottants transmis dans la ligne de commandes.
Hypothèses : les flottants transmis sont des litéraux de float valides.
"""
import sys
Remarques :
5.2 prog2.py
Le script :
#!/usr/bin/env python3
"""
Calcule la somme des deux nombres flottants saisis au clavier.
Hypothèses : les flottants saisis sont des litéraux de float valides.
"""
Un affichage possible :
Remarque :
6 STRUCTURE CONDITIONELLE
6.1 Structure conditionnelle if …
Syntaxe :
où
"""
Résout une équation du premier degré a X + b = 0 dont les
coefficients a et b sont deux nombres flottants saisis au clavier.
Hypothèses : les flottants saisis sont des litéraux de float valides.
"""
Remarques :
7 STRUCTURES RÉPÉTITIVES
7.1 Structure répétitive while …
Syntaxe :
où
Si la clause else est présente, elle sera exécutée une seule fois lorsque expression s’évalue à False.
"""
Jeu de la devinette du nombre.
Il faut trouver un nombre généré aléatoirement. Chaque fois que le joueur
propose un nombre, le programme indique s'il est trop petit, trop grand ou
exact.
"""
import random
MAX = 1000
Un affichage possible :
Remarques :
"""
Sommes cumulées des valeurs positives paires lues
"""
sum_even = 0
i = int(input("Valeur entière <-1 pour terminer> ? "))
while i > 0:
sum_even += i if i % 2 == 0 else 0 # ternary operator
i = int(input("Valeur entière <-1 pour terminer> ? "))
print("Somme des valeurs cumulées paires:", sum_even)
Un affichage possible :
Remarque :
"""
Lecture d'un nombre entier entre MIN et MAX
"""
MIN, MAX = 1, 10
nbr = -1
# while not(nbr>=MIN and nbr<=MAX):
while nbr < MIN or nbr > MAX: # short-circuiting of evaluation of logical expressions
nbr = int(input("Valeur entière entre " + str(MIN) + " et " + str(MAX) + " ? "))
print("Votre nombre:", nbr)
Un affichage possible :
Remarques :
Syntaxe :
Voici un extrait de la définition de la syntaxe telle que présentée dans la documentation Python
(https://docs.python.org/3/reference/compound_stmts.html#the-for-statement)
The for statement is used to iterate over the elements of a sequence (such as a string, tuple or
list) or other iterable object:
The expression list is evaluated once; it should yield an iterable object. An iterator is created for
the result of the expression_list. The suite is then executed once for each item provided by the
iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using
the standard rules for assignments (see Assignment statements), and then the suite is executed.
When the items are exhausted (which is immediately when the sequence is empty or an iterator
raises a StopIteration exception), the suite in the else clause, if present, is executed, and the
loop terminates.
A break statement executed in the first suite terminates the loop without executing the else
clause’s suite. A continue statement executed in the first suite skips the rest of the suite and
continues with the next item, or with the else clause if there is no next item.
"""
Exemples simples d'utilisation de my_list'instruction for
"""
import time
s = "Hello"
for c in s:
print(c, ord(c), sep=':', end=' - ')
print()
my_list = [1, 2, 3, 4]
for e in my_list: # e=my_list[0], e=my_list[1], ...
e = e + 10
print(my_list)
# my_list is not modified !
# e=my_list[0] e=e+10 -> my_list not modified
for i in range(5):
print(i, end=' ')
print()
tic = time.process_time()
for i in range(100000000):
print(i, end=' ')
if i == 10:
break
print()
toc = time.process_time()
print(toc - tic)
tic = time.process_time()
for i in list(range(100000000)):
print(i, end=' ')
if i == 10:
break
print()
toc = time.process_time()
print(toc - tic)
str_ = "Hello"
for i, c in zip(range(len(str_)), str_):
print(i, " ", c, end=' , ')
print()
Un affichage :
Remarques :
La modification de la variable de contrôle e n’a pas modifié l’élément dans la liste (e est une
référence…) !
range() fournit un itérateur, pas une séquence …
La fonction zip() permet de parcourir plusieurs séquences en parallèle. Elle peut recevoir plus de
deux séquences, et elle s’arrête dès que la plus courte est épuisée. Elle renvoie un itérateur sur des
tuples.
8 LES EXCEPTIONS
Le script :
#!/usr/bin/env python3
import locale
import time
print(sqrt(4))
try:
sr = sqrt(-4)
print('sqrt(-4) =', sr)
except TypeError:
print('Mauvais type')
except ValueError as e:
print('Mauvaise valeur:', e)
except: # do not use bare except : too broad exception clause
print('Autre problème')
finally:
print('Toujours effectué')
print('On continue')
f = None
try:
f = open('data.txt')
s = f.readline()
i = int(s.strip())
except (IOError, ValueError):
print('Le fichier data.txt ne peut pas être ouvert')
print('ou la première ligne ne contient pas un entier')
else:
print(i)
finally:
if f:
f.close()
L’affichage :
2.0
Mauvaise valeur: must be >= 0
Toujours effectué
On continue
Le fichier data.txt ne peut pas être ouvert
ou la première ligne ne contient pas un entier
Ctrl-C to arrêter le flux du temp!
dim., 16 août 2015 09:15:54
dim., 16 août 2015 09:15:55
dim., 16 août 2015 09:15:56
dim., 16 août 2015 09:15:57
dim., 16 août 2015 09:15:58
Cette façon d'arrêter une boucle est déconseillée...
A+
Commentaires :
Les exceptions permettent de délocaliser le traitement d’un problème par rapport à l’endroit dans le
code où celui-ci s’est manifesté.
Elles permettent de bien séparer le code « normal » du code qui traite les cas exceptionnels.
Permettent d’éviter de faire de nombreux tests (lisibilité et efficacité).
Permettent de « rassembler » le traitement de nombreuses exceptions (cf. except (…, ...): ou
except:).
Minimise les risques en cas d’oubli de traitement d’une condition exceptionnelle par le programmeur.
La clause optionnelle else est exécutée si aucune exception n’a été lancée.
La clause optionnelle finally est exécutée dans tous les cas (quand il y a ou qu’il n’y a pas
d’exception lancée).
a = "bonjour"
b = """ici je mets
mon texte
sur plusieurs
lignes"""
print(b)
print(len(a))
print(a[0])
print(a[6])
print(a[-1]) # last character
print(a[-7])
# a[0]='B' # strings are immutable objects
a = 'B' + a[1:] # slicing
print(a)
print(a[2:6]) # slicing first included last excluded
print(a[:5])
print(a[2:])
print(a[::2]) # even characters
print(a[::-1]) # reverse order
s = 'trapézoïdal'
for car in a: # strings are sequences
print(car, ord(car), end=' , ')
print()
vowels = 'AaàâEeéèêëIiîïOoUuùYy'
for car in s:
if car in vowels: # test if an element is in a sequence
print(car, " est une voyelle.")
s1 = 'abc'
s2 = 'abc'
print(s1 is s2) # some object can be reused because of immutability
L’affichage :
ici je mets
mon texte
sur plusieurs
lignes
7
b
r
r
b
Bonjour
njou
Bonjo
njour
Bnor
ruojnoB
B 66 , o 111 , n 110 , j 106 , o 111 , u 117 , r 114 ,
a est une voyelle.
é est une voyelle.
o est une voyelle.
ï est une voyelle.
a est une voyelle.
False
False
!"#$%&'()*+,-
./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
True
Remarques :
9.2 Tuples
Les tuples sont des séquences immuables d’éléments pouvant être de types différents.
Les littéraux de tuples sont délimités par (), mais celles-ci peuvent être souvent omises (packing).
t1 = 1, 'deux', 3.0
print(t1)
print(len(t1))
print(t1[::-1])
t2 = ('quatre', 5, 6)
t3 = t1 + t2
print(t3)
print(t3[2:5])
t4 = t1 * 3
print(t4)
for e in t4:
if type(e) is int: # test if type of e is exactly int
print(e)
for e in t4:
if isinstance(e, str): # test if type e is a str_ (ok if subclass)
print(e)
t = 1, 2, 3 # packing
print(t)
a, b, c = t # unpacking
print(a, b, c)
# a,b=t # too many values to unpack
t = 0, 'un', (2.1, 'two.two'), 3
print(t)
print(type(t[2]))
print(t[2][1])
t = (3) # not a tuple
print(t, type(t))
t = (3,) # a tuple
print(t, type(t))
L’affichage :
Remarques :
Les opérateurs de concaténation (+), de répétition (*), de test d’appartenance (in) ainsi que le slicing
([:]) fonctionnent comme avec les chaînes de caractères.
Les opérateurs relationnels peuvent être utilisés avec les tuples.
9.3 Listes
Les listes sont des séquences muables d’éléments pouvant être de types différents.
Les littéraux de listes sont délimités par [].
my_list_1 = [1, 2, 3]
my_list_1[0] = 0
print(my_list_1)
my_list_1 = [2, 3, 5, 7]
empty = []
print(type(empty))
print(len(empty))
my_list_2 = ['gains', 'bar', 6, 9, (0, 1, 2), [0, 1, 2]]
print(my_list_2)
print(len(my_list_2))
print(type(my_list_2[4]))
print(type(my_list_2[5]))
print(my_list_2[-1])
print(my_list_2[2:4])
my_list_3 = my_list_1 + my_list_2
print(my_list_3)
print(my_list_1 * 3)
print(1 in my_list_1)
print(my_list_1 < [0, 1, 2])
my_list_4 = [0, 1, 2]
# my_list_4[1:1]=1 # 1 is not an iterable
my_list_4[1:1] = 'un' # insert an iterable before empty sequence 1:1
# insert ('u','n') !
print(my_list_4)
Introduction à la programmation Python
HE2B - ISIB 2022/2023 ÉLECTRONIQUE & INFORMATIQUE II - Laboratoire de techniques informatiques 1 - J.M. Mattens 27
my_list_1.reverse()
print(my_list_1)
my_list_1.sort()
print(my_list_1)
my_list = [0, 1, 2]
my_list.append(3)
my_list[len(my_list):len(my_list)] = [4]
my_list.insert(len(my_list), 5)
my_list.extend([6])
# my_list[len(my_list)]=7 # bad
print(my_list)
del my_list[0]
my_list[0:1] = []
print(my_list)
my_list[3:5] = [0, 1, 2, 3]
print(my_list)
del (my_list[3:6])
print(my_list)
my_list_1 = [0, 1, 2]
my_list_2 = my_list_1
print(my_list_2 is my_list_1)
my_list_1 = my_list_1 + [3] # create a new list !
print(my_list_2 is my_list_1)
my_list_1[0] = 9
print(my_list_1, my_list_2)
my_list_1 = [0, 1, 2]
my_list_2 = [0, 1, 2]
print(my_list_1 is my_list_2)
L’affichage :
[0, 2, 3]
<class 'list'>
0
['gains', 'bar', 6, 9, (0, 1, 2), [0, 1, 2]]
6
<class 'tuple'>
<class 'list'>
[0, 1, 2]
[6, 9]
[2, 3, 5, 7, 'gains', 'bar', 6, 9, (0, 1, 2), [0, 1, 2]]
[2, 3, 5, 7, 2, 3, 5, 7, 2, 3, 5, 7]
False
False
[0, 'u', 'n', 1, 2]
[0, 'ab', 'cd', 'ef', 1, 2]
[0, 'u', 'n', 1, 2]
[0, 'u', 'n', 1, 3, 4, 2]
[0, 'u', 'n', 1, 4, 2]
[0, 1, 4, 2]
[0, 1, 4, 2, 3]
[0, 1, 4, 2, 3, (5, 6)]
[0, 1, 4, 2, 3, (5, 6), 5, 6]
[0, 1, 4, 2, 3, (5, 6), 5, 6, 5, 6]
['go', 0, 1, 4, 2, 3, (5, 6), 5, 6, 5, 6]
6
2
8
['go', 0, 1, 4, 2, 3, (5, 6), 5, 5, 6]
['go', 0, 1, 4, 2, 3, (5, 6), 5, 5]
[7, 5, 3, 2]
[2, 3, 5, 7]
[0, 1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6]
[2, 3, 4, 0, 1, 2, 3]
[2, 3, 4, 3]
True
False
[9, 1, 2, 3] [0, 1, 2]
False
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<class 'range'>
9
Remarques :
Les opérateurs de concaténation (+), de répétition (*), de test d’appartenance (in) fonctionnent comme
avec les chaînes de caractères.
Le slicing ([:]) est utilisable et permet de modifier, supprimer, insérer.
Les opérateurs relationnels peuvent être utilisés avec les listes.
Les listes peuvent être utilisées comme des piles grâce aux fonctions append() et pop() (opérations
agissant sur la fin de la liste).
Les listes peuvent être utilisées comme des files mais, attention, les opérations d’insertion et de
suppression en tête de liste ne sont pas rapides (contrairement à ces mêmes opérations en fin de liste).
Le script :
#!/usr/bin/env python3
u[0] = 3
u[2][0] = 4
print(u, v)
u[0] = 3
u[2][0] = 4
print(u, v)
L’affichage :
[0, 1, [21, 22]] [0, 1, [21, 22]]
False
True
[3, 1, [4, 22]] [0, 1, [4, 22]]
[0, 1, [21, 22]] [0, 1, [21, 22]]
False
False
[3, 1, [4, 22]] [0, 1, [21, 22]]
[[[...], 21, 22], 11, 12] [[[...], 11, 12], 21, 22]
[[[...], 11, 12], 21, 22]
False
[[[...], 1111, 12], 21, 22]
[[[...], 1111, 12], 2211, 22]
[[[...], 21, 22], 11, 12]
La compréhension de listes (list comprehension) est une méthode concise pour créer des listes.
Une utilisation courante de cette méthode consiste à créer une liste à partir d’opérations appliquées à tous les
éléments d’une autre séquence ou d’un objet itérable ou à créer une sous-séquence des éléments satisfaisant une
certaine condition.
Le script :
#!/usr/bin/env python3
squares = []
for x in range(10):
squares.append(x ** 2)
print(squares)
combs = []
for x in [1, 2, 3]:
for y in [3, 1, 4]:
if x != y:
combs.append((x, y))
print(combs)
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
transposed = [[row[i] for row in matrix] for i in range(4)]
print(transposed)
transposed = []
for i in range(4):
# the following 3 lines implement the nested list comprehension
transposed_row = []
for row in matrix:
transposed_row.append(row[i])
transposed.append(transposed_row)
print(transposed)
L’affichage :
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
9.4 Ensembles
Les sets sont des collections non ordonnées muables d’éléments non dupliqués pouvant être de types différents.
Les éléments de l’ensemble doivent être des objets « hashables » (int, float, str, tuple,… mais pas
list, set, dict, …).
Les littéraux d’ensembles sont délimités par {}.
Les opérations mathématiques d’union, d’intersection, de différence sont réalisables.
Le type set est itérable.
s1 = set('alabama')
s2 = set('alaska')
print(s1)
print(s2)
print(s1 - s2)
print(s1 | s2)
print(s1 & s2)
print(s1 ^ s2)
my_list = list(s1 & s2)
print(my_list)
my_list = set({}) # my_list={} creates a dictionary!
print(my_list)
for e in s1:
print(e)
L’affichage :
{'head', 'foot', 'hand'}
True
False
{'l', 'b', 'a', 'm'}
{'l', 'a', 's', 'k'}
{'b', 'm'}
{'l', 's', 'm', 'b', 'a', 'k'}
{'l', 'a'}
{'s', 'm', 'b', 'k'}
['l', 'a']
set()
l
b
a
m
9.5 Dictionnaires
Les dictionnaires sont des séquences modifiables où les « indices » (les clés) ne sont pas forcément des entiers.
A chaque clé (unique) correspond une valeur.
Les clés doivent être des objets « hashables » (donc non modifiables) (int, float, str, tuple,… mais pas
list, set, dict, …).
Même s’il existe une notion d’ordre sur les clés, cet ordre n’est généralement pas prévisible du point de vue du
programmeur ().
Tout comme les littéraux d’ensemble, les littéraux de dictionnaires sont délimités par {} , mais on utilise la
syntaxe clé:valeur pour définir les paires :
for a, f in my_dico.items():
print(a, ':', f, end=',')
print()
print(my_dico.setdefault('two', 'twee'))
print(my_dico)
print(my_dico.setdefault('five', 'cinq'))
print(my_dico)
# print(my_dico.pop('six')) # exception
print(my_dico.pop('six', None))
print(my_dico.pop('one', None))
while my_dico:
c, v = my_dico.popitem() # arbitrary pair
print(c, v)
print(my_dico)
print(my_graph)
print(my_graph['Bruxelles']['Mons'])
print(len(my_graph))
print('Enhet' in my_graph)
for t1 in my_graph:
for t2 in my_graph[t1]:
# lazy evaluation ...
if t2 in my_graph and t1 in my_graph[t2] and my_graph[t1][t2] ==
my_graph[t2][t1]:
print('Symétrie pour', t1, t2)
t = set(my_graph.keys())
for t1 in my_graph:
t = t | set(my_graph[t1].keys())
print("{0:10s}".format(''), end='')
for t2 in t:
print("{0:10s}".format(t2), end='')
print()
for t1 in t:
print("{0:10s}".format(t1), end='')
for t2 in t:
d = my_graph.get(t1, {}).get(t2, 0)
print("{0:<10.2f}".format(d), end='')
print()
L’affichage :
{'three': 'trois', 'one': 'un', 'two': 'deux'}
<class 'dict'>
deux
{'three': 'trois', 4: 'quatre', 'one': 'un', 'two': 'deux'}
{'three': 'trois', 4: 'quatre', 'one': 'un', 'two': 'deux', (6, 6): 66}
3713087044579978631
dict_keys(['three', 4, 'one', 'two', (6, 6)])
dict_values(['trois', 'quatre', 'un', 'deux', 66])
three : trois,4 : quatre,one : un,two : deux,(6, 6) : 66,
deux
{'three': 'trois', 4: 'quatre', 'one': 'un', 'two': 'deux', (6, 6): 66}
cinq
{4: 'quatre', (6, 6): 66, 'three': 'trois', 'five': 'cinq', 'one': 'un', 'two': 'deux'}
{4: 'four', 5: 'cinq', (6, 6): 66, 'three': 'trois', 'five': 'cinq', 'one': 'un', 'two':
'deux'}
None
un
4 four
5 cinq
(6, 6) 66
three trois
five cinq
two deux
{}
{'Namur': {'Liège': 40}, 'Charleroi': {'Bruxelles': 30, 'Mons': 40}, 'Bruxelles':
{'Liège': 100, 'Mons': 50, 'Charleroi': 30}, 'Mons': {'Bruxelles': 50, 'Charleroi': 25},
'Liège': {'Namur': 40, 'Bruxelles': 101}}
50
5
False
Symétrie pour Namur Liège
Symétrie pour Charleroi Bruxelles
Symétrie pour Bruxelles Mons
Symétrie pour Bruxelles Charleroi
Symétrie pour Mons Bruxelles
Symétrie pour Liège Namur
{'Namur': {'Liège': 40}, 'Liège': {'Namur': 40, 'Bruxelles': 101}, 'Bruxelles': {'Liège':
100, 'Mons': 50, 'Charleroi': 30}, 'Mons': {'Bruxelles': 50, 'Charleroi': 25},
'Charleroi': {'Bruxelles': 30, 'Mons': 40}}
{}
Namur Mons Charleroi Liège Bruxelles
Namur 0.00 0.00 0.00 40.00 0.00
Mons 0.00 0.00 25.00 0.00 50.00
Charleroi 0.00 40.00 0.00 0.00 30.00
Liège 40.00 0.00 0.00 0.00 101.00
Bruxelles 0.00 50.00 30.00 100.00 0.00
Remarques :
print(int())
print(int('123'))
print(int(9.9))
print(int(-9.9))
print(int('FFFF', 16))
print(float())
print(float(12345678901234567890))
print(float('+1.23'))
print(float(' -12345\n'))
print(float('1e-003'))
print(float('-Infinity'))
print(float('NaN'))
print(float('inf'))
print(bool())
print(bool(3))
print(bool(0))
print(bool(0.2))
print(bool((1, 2)))
print(bool(()))
print(bool([1, 2]))
print(bool([]))
print(bool({}))
print(str())
print(str('truc'))
print(str(12))
print(str(12.3))
print(str(True))
print(str((1, 2, 3)))
print(str([1, 2, 3]))
print(str({1, 2, 3}))
print(str({'un': 1, 2: 'deux'}))
print(str(range(10, 0, -2)))
print(tuple())
print(tuple('abc'))
print(tuple((1, 2, 3)))
print(tuple([1, 2, 3]))
print(tuple({1, 2, 3}))
print(tuple({'un': 1, 2: 'deux'}))
print(tuple(range(10, 0, -2)))
print(list())
print(list('abc'))
print(list((1, 2, 3)))
print(list([1, 2, 3]))
print(list({1, 2, 3}))
print(list({'un': 1, 2: 'deux'}))
print(list(range(10, 0, -2)))
print(set())
print(set('abc'))
print(set((1, 2, 3)))
print(set([1, 2, 3]))
print(set({1, 2, 3}))
print(set({'un': 1, 2: 'deux'}))
print(set(range(10, 0, -2)))
print(dict())
print(dict((('two', 2), ('one', 1), ('three', 3))))
print(dict({('two', 2), ('one', 1), ('three', 3)}))
print(dict([('two', 2), ('one', 1), ('three', 3)]))
print(dict({'three': 3, 'one': 1, 'two': 2}))
print(dict(zip(['one', 'two', 'three'], [1, 2, 3])))
L’affichage :
0
123
9
-9
65535
0.0
1.2345678901234567e+19
1.23
-12345.0
0.001
-inf
nan
inf
False
True
False
True
True
False
True
False
False
truc
12
12.3
True
(1, 2, 3)
[1, 2, 3]
{1, 2, 3}
{2: 'deux', 'un': 1}
range(10, 0, -2)
()
('a', 'b', 'c')
(1, 2, 3)
(1, 2, 3)
(1, 2, 3)
(2, 'un')
(10, 8, 6, 4, 2)
[]
['a', 'b', 'c']
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[2, 'un']
[10, 8, 6, 4, 2]
set()
{'a', 'b', 'c'}
{1, 2, 3}
{1, 2, 3}
{1, 2, 3}
{2, 'un'}
{8, 10, 2, 4, 6}
{}
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
11 LES FONCTIONS
11.1 Script fibFctDemo.py
Le script :
#!/usr/bin/env python3
show_fibonacci(10)
show_fibonacci(10, i1=2)
show_fibonacci(10, 1, 3)
show_fibonacci(10, i1=3, i0=1)
print(show_fibonacci(10)) # function return None
fs = compute_fibonacci(8)
print(fs)
L’affichage :
0 1 1 2 3 5 8 13 21 34
0 2 2 4 6 10 16 26 42 68
1 3 4 7 11 18 29 47 76 123
1 3 4 7 11 18 29 47 76 123
0 1 1 2 3 5 8 13 21 34
None
[0, 1, 1, 2, 3, 5, 8, 13]
Commentaires :
gcd(a, b)
Renvoie le plus grand commun diviseur des 2 valeurs entières reçues.
>>> print(gcd(12,30))
Traceback (most recent call last):
File "<console>", line 0, in <module>
TypeError: 'module' object is not callable
>>> print(gcd.gcd(12,30))
6
>>> a,b=12,30
>>> print(gcd.gcd(a,b))
6
>>> print(a,b)
12 30
Remarque :
Les arguments sont passés par valeur (par copie). Donc, ce sont des copies des références a et b qui sont
transmises à la fonction. Il y a des variables a et b dans la table des symboles du shell et deux autres
variables a et b dans la table des symboles locale à cet appel à gcd. Juste après l’appel le a du shell et
le a local désignent un même objet « 12 » mais les affectations aux variables locales a et b n’ont pas
d’incidence sur les variables du shell ! Remarquons également que les objets utilisés ne sont pas
modifiables.
a, b = 1, 2
bad_swap(a, b)
print(a, b)
a, b = swap(a, b)
print(a, b)
L’affichage :
1 2
2 1
Remarque :
Les arguments, qui sont des références, sont passés par valeur (par copie)…
print(do_sum(1, 2))
print(do_sum(1.1, 2.2))
print(do_sum('ab', 'cd'))
print(do_sum(True, True)) # True -> 1
L’affichage :
3
3.3000000000000003
abcd
2
Traceback (most recent call last):
File
"D:\users\jean\Documents\Ann_2223\isib\python\2ZZ1303\syllabus\demos\sumPolymorph.py",
line 15, in <module>
print(do_sum('ab', 3)) # exception
File
"D:\users\jean\Documents\Ann_2223\isib\python\2ZZ1303\syllabus\demos\sumPolymorph.py",
line 7, in do_sum
return a + b
TypeError: can only concatenate str (not "int") to str
Remarques :
Python utilise un typage dynamique fort, ce qui permet des comportements polymorphes (dynamiques)
de fonctions.
Il est impératif en Python de bien contrôler les types des objets que l’on manipule et de gérer les
éventuelles erreurs de type possibles (cf. gestion des exceptions).
g(1, 2)
g(1, 2, 3)
g(1, 2, 3, 4)
# positional argument must precede keyword argument
g(1, 2, 3, 4, 'big', 'bang', truc=7, bidule=8)
g(1, 2, optional2=3, truc=7, optional1=4, bidule=8)
t = (19, 5)
print(divmod(*t))
L’affichage :
required1: 1
required2: 2
optional1: 0
optional2: 1
args: ()
required1: 1
required2: 2
optional1: 3
optional2: 1
args: ()
required1: 1
required2: 2
optional1: 3
optional2: 4
args: ()
required1: 1
required2: 2
optional1: 3
optional2: 4
args: ('big', 'bang')
truc : 7
bidule : 8
required1: 1
required2: 2
optional1: 4
optional2: 3
args: ()
truc : 7
bidule : 8
(3, 4)
Commentaires :
Il est possible de créer des fonctions qui admettent un nombre variable d’arguments en utilisant un
paramètre dont le nom commence par * et qui rassemble (gather) les arguments en un tuple.
Il ne peut y avoir qu’un seul paramètre « gather » et il doit après les arguments positionels.
Les paramètres optionnels doivent venir après les paramètres requis.
Lorqu’un paramètre de type **param est présent ; il collecte dans un dictionnaire tous les arguments
nommés (« keyword argument » de forme key=value) qui ne correspondent pas à des paramètres.
L’opérateur * appliqué à un tuple lors de l’appel à une fonction permet de « transformer » le tuple en
une suite d’arguments (scatter).
import math
f = lambda x: x ** 3 - 3.0 * x ** 2 + 2 * x + 1
print(rect_integration(f, -1.0, 1.0, 1000))
L’affichage :
1.000010280911905
1.000000102808391
1.000010280911905
1.0000000010279895
2.0000000021829813e-06
-1.7968109910105473e-16
Commentaires :
a, b, c, d = 1, 2, 3, 4
print(a, b, c, d)
f(b)
print(a, b, c, d)
def outer():
x = 11
def inner():
y = 22
print('inner->', x, y, z) # rule local-> enclosed -> global -> built-in
print('outer->', x, y, z)
inner()
print('outer->', x, y, z)
x, y, z = 1, 2, 3
print('global->', x, y, z)
outer()
print('global->', x, y, z)
L’affichage :
1 2 3 4
11 12 13 4
11 2 3 4
global-> 1 2 3
outer-> 11 2 3
inner-> 11 22 3
outer-> 11 2 3
global-> 1 2 3
Commentaires :
Le mot clé global permet de signaler dans une fonction que l’on veut utiliser une variable globale de
nom donné.
L’exécution de la fonction provoque la création d’une nouvelle table des symboles utilisée pour les
variables locales de la fonction (cf. contexte de pile). Toute assignation de variable dans la fonction
ajoute la variable dans la table locale si elle n’est pas déjà présente. Toute référence à une variable dans
la fonction provoque une recherche dans la table locale, puis dans les tables locales des fonctions
englobantes, puis dans la table des symboles globale, puis finalement dans la table des noms prédéfinis.
12 LES FICHIERS
12.1 Script files.py
Le script :
#!/usr/bin/env python3
import random
import os
os.chdir("./data")
size = os.stat('data.txt').st_size
print(size)
# should use true random cryptage phrase
random.seed(19856325475123052585)
rba = bytearray(random.getrandbits(8) for i in range(size)) # generator object
print('Key:', rba)
# encrypt
BUFF_SIZE = 4 # should be greather
bf = open('data.txt', 'rb+')
i = 0
while True:
b = bf.read(BUFF_SIZE)
if not b:
break
ln = len(b)
eba = bytearray(b[j] ^ rba[i + j] for j in range(ln)) # XOR
bf.seek(-ln, 1) # from_what: 0,1,2 (begin,current,enb)
bf.write(eba)
i += ln
bf.seek(0, 0)
print('Encrypted file:', bf.read())
bf.close()
# decrypt
bf = open('data.txt', 'rb+')
i = 0
while True:
b = bf.read(BUFF_SIZE)
if not b:
break
ln = len(b)
eba = bytearray(b[j] ^ rba[i + j] for j in range(ln))
bf.seek(-ln, 1) # from_what: 0,1,2 (begin,current,enb)
bf.write(eba)
i += ln
bf.seek(0, 0)
print('Decrypted file:', bf.read())
itf.close()
cd = os.getcwd()
print(cd)
def dir_walk(dirname):
for name in os.listdir(dirname):
path = os.path.join(dirname, name)
if os.path.isfile(path):
print(path)
else:
dir_walk(path)
dir_walk(cd + '\\..')
Un affichage :
Ceci est
un fichier texte
àäâéèëêùç
123.45
[1, 2, 3]
Ceci est
u
n fichier
texte
àäâé
èëêùç
123.
45
[1, 2,
3]
Ceci est
un fichier texte
àäâéèëêùç
123.45
[1, 2, 3]
['Ceci est\n', 'un fichier texte\n', 'àäâéèëêùç\n', '123.45\n', '[1, 2, 3]\n']
58
Key:
bytearray(b"{8\xc9\x9f\xbf\x95{\x93E$m\xf4\xe2s\x07\x8ae\x8f\xd9\xee\xc89\xc21!N\xf7\x8e\
xfa\xc1l\xd2\xc67\xfc\x84\xa4\xeeg\xf4\xb2k\x8dW\x11\x06w\xea\x18\x03U\'\xd0\x8bnjw\xdf")
Encrypted file:
b'8]\xaa\xf6\x9f\xf0\x08\xe7H.\x18\x9a\xc2\x15n\xe9\r\xe6\xbc\x9c\xe8M\xa7IU+\xfa\x84\x1a
%\x8e;.\xdc\x16}C\xe3m\xc5\x80X\xa3c$\x0b}\xb1)/u\x15\xfc\xab]7z\xd5'
Decrypted file: b'Ceci est\r\nun fichier
texte\r\n\xe0\xe4\xe2\xe9\xe8\xeb\xea\xf9\xe7\r\n123.45\r\n[1, 2, 3]\r\n'
Ceci est
un fichier texte
àäâéèëêùç
123.45
[1, 2, 3]
D:\Ann_1516\isib\python\5IN0304\data
D:\Ann_1516\isib\python\5IN0304\data\..\badPermut.py
D:\Ann_1516\isib\python\5IN0304\data\..\data\data.txt
D:\Ann_1516\isib\python\5IN0304\data\..\data\data_utf8.txt
D:\Ann_1516\isib\python\5IN0304\data\..\data\words.txt
D:\Ann_1516\isib\python\5IN0304\data\..\dictionaries.py
D:\Ann_1516\isib\python\5IN0304\data\..\exceptions.py
D:\Ann_1516\isib\python\5IN0304\data\..\fibFctDemo.py
D:\Ann_1516\isib\python\5IN0304\data\..\files.py
D:\Ann_1516\isib\python\5IN0304\data\..\forDemo.py
D:\Ann_1516\isib\python\5IN0304\data\..\gatherAndScatter.py
D:\Ann_1516\isib\python\5IN0304\data\..\gcd.py
D:\Ann_1516\isib\python\5IN0304\data\..\ifDemo.py
D:\Ann_1516\isib\python\5IN0304\data\..\integRect.py
D:\Ann_1516\isib\python\5IN0304\data\..\listComprehension.py
D:\Ann_1516\isib\python\5IN0304\data\..\listCopy.py
D:\Ann_1516\isib\python\5IN0304\data\..\lists.py
D:\Ann_1516\isib\python\5IN0304\data\..\noDoDemo.py
D:\Ann_1516\isib\python\5IN0304\data\..\prog1.py
D:\Ann_1516\isib\python\5IN0304\data\..\prog2.py
D:\Ann_1516\isib\python\5IN0304\data\..\scope.py
D:\Ann_1516\isib\python\5IN0304\data\..\sets.py
D:\Ann_1516\isib\python\5IN0304\data\..\shell.py
D:\Ann_1516\isib\python\5IN0304\data\..\strings.py
D:\Ann_1516\isib\python\5IN0304\data\..\sumPolymorph.py
D:\Ann_1516\isib\python\5IN0304\data\..\transtypage.py
D:\Ann_1516\isib\python\5IN0304\data\..\tuples.py
D:\Ann_1516\isib\python\5IN0304\data\..\whileDemo1.py
D:\Ann_1516\isib\python\5IN0304\data\..\whileDemo2.py
Commentaires :
open(filename,mode) ouvre un fichier de nom donné dans le mode demandé. mode peut être
'r' (lecture), 'w' (écriture), 'a' (ajout), 'r+' (lecture/écriture). Si on ajoute b au mode, le
fichier est ouvert en mode binaire (les lectures et écritures utilisent des objets bytes et non plus des
str). mode est optionnel et la valeur par défaut est 'r'. Le paramètre optionnel encoding permet
de définir l’encodage du fichier
f.read() renvoie tout le contenu du flux sous forme d’un objet str ou bytes suivant le mode
d’ouverture.
f.read(size) renvoie un objet str ou bytes contenant maximum size éléments (caractères ou
bytes).
f.readline() renvoie la ligne suivante du flux (mode texte) ou une chaîne vide en cas de fin de
fichier.
f.readlines() renvoie la liste des lignes dans le flux
f.write(string) ou f.write(bytes) écrit dans le flux les caractères ou les bytes et renvoie le
nombre d’éléments écrits.
f.tell() renvoie la position courante en nombre de bytes depuis le début du fichier. N’a d’intérêt
que pour les fichiers binaires.
f.seek(offset, from_what) définit la position du curseur. from_what peut être 0 (début), 1
(position courante) ou 2 (fin de fichier).
f.close() permet de fermer le flux et de libérer les ressources système associées.
Pour lire les lignes d’un fichier, il est possible, et efficace, de boucler sur l’objet flux
(for line in f:).
https://docs.python.org/3/howto/functional.html
https://docs.python.org/fr/3/glossary.html
https://en.wikipedia.org/wiki/Functional_programming
13.1 Présentation
Python n’est pas un langage de programmation fonctionnelle mais permet d’écrire des fragments de code dans
un style « programmation fonctionnelle ».
Fonctions pures :
Le code est idempotent c.-à-d. que la valeur de retour d’une fonction ne dépend que de ses arguments
(on parle également de transparence référentielle).
Les fonctions n’ont pas d’effet de bord (mémoire ou E/S).
Elles n’ont pas d’état « externe » (pas d’usage de variables globales ou de variables membres de la
classe ou de l’objet qui les contiendraient).
Fonctions pouvant prendre des fonctions comme arguments (« callback ») ou renvoyer une fonction
comme résultat.
Récursivité :
La méthode prédéfinie iter() reçoit un objet et renvoie un itérateur si celui-ci est « itérable ». Dans le cas
contraire une exception TypeError. Les types prédéfinis suivants sont itérables : list, tuple, dict,
string, file.
On peut parcourir la séquence produit par un itérateur avec l’instruction « for e in obj : … » qui est
équivalente à « for e in iter(obj) : … ».
for i in iter(obj):
print(i)
for i in obj:
print(i)
Les listes et les tuples proposent des constructeurs qui acceptent des itérateurs.
Par contre l’expression suivante utilise une expression génératrice et renvoie un objet générateur :
Exemple :
for e in fibonacci_generator(4):
print(e, end=' ')
print()
print(sum(fibonacci_generator(100)))
Affichage :
0 1 1 2
316912650057057350374175801344
Exemple :
f1 = lambda x: x + 1
print(f1(3))
f2 = lambda x, y: x * y
print(f2(2, 3))
Affichage :
4
6
-1.0
Référence : https://docs.python.org/3/library/functions.html
range(stop)
range(start, stop[, step])
Rather than being a function, range is actually an immutable sequence type, as documented in Ranges and Sequence Types
— list, tuple, range.
Exemple :
for i in range(5):
print(i, end=',')
print()
Affichage :
0,1,2,3,4,
1,2,3,4,
1,3,5,
10,8,6,4,
enumerate(iterable, start=0)¶
Return an enumerate object. iterable must be a sequence, an iterator, or some other object which supports
iteration. The __next__() method of the iterator returned by enumerate() returns a tuple containing
a count (from start which defaults to 0) and the values obtained from iterating over iterable.
Exemple :
Affichage :
<class 'enumerate'>
(0, 'Tintin'),(1, 'Milou'),(2, 'Haddock'),
10-Tintin, 11-Milou, 12-Haddock,
filter(function, iterable)¶
Construct an iterator from those elements of iterable for which function returns true. iterable may be
either a sequence, a container which supports iteration, or an iterator. If function is None, the identity
function is assumed, that is, all elements of iterable that are false are removed.
Exemple :
Affichage :
iter(object[, sentinel])¶
Return an iterator object. The first argument is interpreted very differently depending on the presence of
the second argument. Without a second argument, object must be a collection object which supports the
iteration protocol (the __iter__() method), or it must support the sequence protocol (the
__getitem__() method with integer arguments starting at 0). If it does not support either of those
protocols, TypeError is raised. If the second argument, sentinel, is given, then object must be a callable
object. The iterator created in this case will call object with no arguments for each call to its __next__()
method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value
will be returned.
Exemple :
Affichage :
-1,-1,3,-4,5,-5,6,-4,1,1,-5,-3,-5,3,-2,-5,5,1,3,6,
Exemple :
my_list = [3, 2, 4]
my_iter = map(lambda x: '+-' * x, my_list)
for e in my_iter:
print(e, end=', ')
print()
my_list1 = [3, 2, 4]
my_list2 = [1, 2, 3]
my_iter = map(lambda x, y: x ** y, my_list1, my_list2)
for e in my_iter:
print(e, end=', ')
print()
Affichage :
reversed(seq)¶
Return a reverse iterator. seq must be an object which has a __reversed__() method or supports the
sequence protocol (the __len__() method and the __getitem__() method with integer arguments
starting at 0).
Exemple :
Affichage :
['l', 'e', 'r', 'u', 't', 'a', 'n', ' ', 'i', 'm', 'a', 'l']
zip(*iterables)¶
Make an iterator that aggregates elements from each of the iterables.
Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument
sequences or iterables. The iterator stops when the shortest input iterable is exhausted. With a single
iterable argument, it returns an iterator of 1-tuples. With no arguments, it returns an empty iterator.
Exemple :
print(dict(zip(my_tuple2, my_tuple1)))
Affichage :
all(iterable)¶
Return True if all elements of the iterable are true (or if the iterable is empty).
any(iterable)¶
Return True if any element of the iterable is true. If the iterable is empty, return False.
Exemple :
Affichage :
False
True
There are two optional keyword-only arguments. The key argument specifies a one-argument ordering
function like that used for list.sort(). The default argument specifies an object to return if the
provided iterable is empty. If the iterable is empty and default is not provided, a ValueError is raised.
If multiple items are maximal, the function returns the first one encountered. This is consistent with other
sort-stability preserving tools such as sorted(iterable, key=keyfunc, reverse=True)[0]
and heapq.nlargest(1, iterable, key=keyfunc).
There are two optional keyword-only arguments. The key argument specifies a one-argument ordering
function like that used for list.sort(). The default argument specifies an object to return if the
provided iterable is empty. If the iterable is empty and default is not provided, a ValueError is raised.
If multiple items are minimal, the function returns the first one encountered. This is consistent with other
sort-stability preserving tools such as sorted(iterable, key=keyfunc)[0] and
heapq.nsmallest(1, iterable, key=keyfunc).
Exemple :
print(min(['truc','machin','chose'],key=lambda x : len(x)))
print(max(['truc','machin','chose'],key=lambda x : len(x)))
print(max(range(0,0,1),default=float('Inf')))
Affichage :
truc
machin
inf
sum(iterable[, start])¶
Sums start and the items of an iterable from left to right and returns the total. start defaults to 0. The
iterable’s items are normally numbers, and the start value is not allowed to be a string.
For some use cases, there are good alternatives to sum(). The preferred, fast way to concatenate a
sequence of strings is by calling ''.join(sequence). To add floating point values with extended
precision, see math.fsum(). To concatenate a series of iterables, consider using
itertools.chain().
Exemple :
print(sum(range(-1000,1000)))
Affichage :
-1000
key specifies a function of one argument that is used to extract a comparison key from each element in
iterable (for example, key=str.lower). The default value is None (compare the elements directly).
reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were
reversed.
The built-in sorted() function is guaranteed to be stable. A sort is stable if it guarantees not to change the
relative order of elements that compare equal — this is helpful for sorting in multiple passes (for example,
sort by department, then by salary grade).
Exemple :
Affichage :
14 EXEMPLES
14.1 Exemple 1 : selectionSortDemo.py
Le script :
#!/usr/bin/env python3
"""
Effectue un tri par sélection sur un tableau d'entiers entrés au
clavier.
"""
def read_list():
"""
Lit au clavier une liste d'entiers.
:return: Une liste contenant la liste des nombres entiers.
"""
my_list = []
s = input('Entrez la liste des entiers séparés par des espaces : ')
str_list = s.split()
for i, e in enumerate(str_list):
my_list.append(int(e))
return my_list
def show_list(_list):
"""
Lit au clavier une liste d'entiers.
:param _list: Une liste contenant la liste des nombres entiers à
afficher.
"""
for e in _list:
# print(i, _list[i])
print("{0:<8d}".format(e), end=' ')
print()
def sort(_list):
"""
Trie une liste d'entiers par la méthode du tri par sélection.
:param _list: Une liste contenant la liste des nombres entiers à
trier.
"""
last = len(_list) - 1
while last > 0:
maxi = 0
for i in range(1, last + 1):
if _list[i] > _list[maxi]:
maxi = i
_list[last], _list[maxi] = _list[maxi], _list[last]
last -= 1
# my_list = {9, 4, 3, 2, 1, 6, 5, 7, 8}
print("Tri par sélection\n")
my_list = read_list()
print("Avant : ")
show_list(my_list)
sort(my_list)
print("Après : ")
show_list(my_list)
Un affichage:
#!/usr/bin/env python3
import sys
def stop():
"""
Affiche le message <tt>"Voulez-vous arrêter <O/N> ?</tt> et
renvoie <tt>true</tt> ou <tt>false</tt>
suivant que l'on désire arrêter ou non.
La lecture est répétée si le caractère introduit n'est pas valide.
return la valeur logique 'vrai' si on veut arrêter, 'faux' sinon.
"""
c = ' '
while c != 'O' and c != 'N':
c = input("Voulez-vous arrêter <O/N> ? ")
c = c.upper()
return c == 'O'
print('a = read_int(0)')
print('a ?', end=' ')
a = read_int(0)
print('a :', a)
print('x = read_float()')
print('x ?', end=' ')
x = read_float()
print('x :', x)
print('x = read_float(1.0)')
print('x ?', end=' ')
x = read_float(1.0)
print('x :', x)
import sys
import inout
from inout import stop
print('a = inout.read_int()')
print('a ?', end=' ')
a = inout.read_int()
print('a :', a)
print('a = inout.read_int(0)')
print('a ?', end=' ')
a = inout.read_int(0)
print('a :', a)
print('x = inout.read_float()')
print('x ?', end=' ')
x = inout.read_float()
print('x :', x)
print('x = inout.read_float(1.0)')
print('x ?', end=' ')
x = inout.read_float(1.0)
print('x :', x)
Un affichage:
a = inout.read_int()
a ? 1
a : 1
a = inout.read_int(0)
a ? -1
Erreur de bornes : For number -1
2
a : 2
a = inout.read_int(0, 10)
a ? 11
Erreur de bornes : For number 11
9
a : 9
a = inout.read_int(maxi=5, mini=-5)
a ? 2
a : 2
x = inout.read_float()
x ? 1.1
x : 1.1
x = inout.read_float(1.0)
x ? 0.5
Erreur de bornes : For number 0.5
2.5
x : 2.5
x = inout.read_float(-1.5, 2.5)
x ? 1.5
x : 1.5
x = inout.read_float(maxi=1.5, mini=-0.5)
x ? -0.6
Erreur de bornes : For number -0.6
0.5
x : 0.5
Voulez-vous arrêter <O/N> ? f
Voulez-vous arrêter <O/N> ? n
Vous continuer...
Voulez-vous arrêter <O/N> ? o
Vous arrêter.
Le script :
#!/usr/bin/env python3
import inout
import sys
"""
Création, lecture, affichage et somme de matrices.
Attention, ceci est une approche procédurale. Il serait préférable de
créer
une classe Matrice. Nous verrons les concepts de la programmation orientée
objet plus tard.Effectue un tri par sélection sur un tableau d'entiers
entrés au clavier.
"""
def create_matrix():
print('Nombre de lignes ? ', end='')
nr = inout.read_int(1, 10)
print('Nombre de colonnes ? ', end='')
nc = inout.read_int(1, 10)
m = []
for i in range(nr):
r = []
for j in range(nc):
print("m[" + str(i) + "][" + str(j) + "] ? ", end='')
r.append(inout.read_float())
m.append(r)
print(m)
return m
def show_matrix(_m):
for i in range(len(_m)):
for j in range(len(_m[i])):
print("{0:<10.2f}".format(_m[i][j]), end='')
print()
is_stop = False
while not is_stop:
print("Matrice 1 ?")
mat1 = create_matrix()
print("Matrice 2 ?")
mat2 = create_matrix()
try:
mat3 = sum_matrix(mat1, mat2)
print('\nMatrice 1 :')
show_matrix(mat1)
print('\nMatrice 2 :')
show_matrix(mat2)
print('\nMatrice somme :')
show_matrix(mat3)
except ValueError as e:
print("Erreur : " + str(e), file=sys.stderr)
is_stop = inout.stop()
Un affichage:
C:\Users\moulinjean\AppData\Local\Programs\Python\Python310\python.exe
D:/users/jean/Documents/Ann_2223/isib/python/2ZZ1303/syllabus/demos/matrix
SumDemo.py
Matrice 1 ?
Nombre de lignes ? 2
Nombre de colonnes ? 3
m[0][0] ? 1
m[0][1] ? 2
m[0][2] ? 3
m[1][0] ? 4
m[1][1] ? 5
m[1][2] ? 6
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
Matrice 2 ?
Nombre de lignes ? 2
Nombre de colonnes ? 3
m[0][0] ? 7
m[0][1] ? 8
m[0][2] ? 9
m[1][0] ? 4
m[1][1] ? 5
m[1][2] ? 6
[[7.0, 8.0, 9.0], [4.0, 5.0, 6.0]]
Matrice 1 :
1.00 2.00 3.00
4.00 5.00 6.00
Matrice 2 :
7.00 8.00 9.00
4.00 5.00 6.00
Matrice somme :
8.00 10.00 12.00
8.00 10.00 12.00
Voulez-vous arrêter <O/N> ? n
Matrice 1 ?
Nombre de lignes ? 1
Nombre de colonnes ? 2
m[0][0] ? 1
m[0][1] ? 2
[[1.0, 2.0]]
Matrice 2 ?
Nombre de lignes ? 2
Nombre de colonnes ? 1
m[0][0] ? 3
m[1][0] ? 4
[[3.0], [4.0]]
Erreur : Incompatible dimensions for row number: 1 != 2
Voulez-vous arrêter <O/N> ? o
Le script :
#!/usr/bin/env python3
"""
Affiche les 16 premières lignes du triangle de Pascal.
"""
NBR = 15
c = [[1]]
for n in range(1, NBR + 1):
r = [1]
r.extend([c[n - 1][i] + c[n - 1][i + 1] for i in range(0, n - 1)])
r.append(1)
# print(r)
c.append(r)
L’affichage:
n \ m 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 -> 1
1 -> 1 1
2 -> 1 2 1
3 -> 1 3 3 1
4 -> 1 4 6 4 1
5 -> 1 5 10 10 5 1
6 -> 1 6 15 20 15 6 1
7 -> 1 7 21 35 35 21 7 1
8 -> 1 8 28 56 70 56 28 8 1
9 -> 1 9 36 84 126 126 84 36 9 1
10 -> 1 10 45 120 210 252 210 120 45 10 1
11 -> 1 11 55 165 330 462 462 330 165 55 11 1
12 -> 1 12 66 220 495 792 924 792 495 220 66 12 1
13 -> 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
14 -> 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
15 -> 1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1