CPGE OUJDA Sup
Tuples
En Python, un tuple est une séquence de valeurs formée en séparant ces valeurs par des virgules. L’usage des parenthèses est recommandé.
>>>
point
=
(1,
2)
>>> print(point) (1, 2)
>>>
course
=
('INFO',
'H',
100)
>>> print(course) ('INFO', 'H', 100)
On peut assigner les valeurs d’un tuple dans un autre possédant le même nombre de valeurs.
>>>
(x,
y)
=
point
#extraction
>>> print(x)
1
>>> print(y)
2
Une fonction peut prendre un tuple en paramètre.
>>>
def
origin_distance(point):
(x,
y)
=
point
return math.sqrt(x ** 2 + y ** 2)
>>> origin_distance((0, 1))
1.0
Une fonction peut aussi renvoyer un tuple, ce qui lui permet par exemple de renvoyer plusieurs valeurs.
>>>
def
divide_modulo(a,
b):
return (a // b, a % b)
>>> (quotient, remainder) = divide_modulo(5, 2)
>>> print(quotient, remainder)
2 1
Exercices
Ex. 1. Écrire une fonction qui vérifie qu’un point est dans un rectangle horizontal. Un point est repré- senté par un tuple (x,y) et un rectangle est représenté par deux points : le coin supérieur gauche et
le coin inférieur droit. Nous supposons que les x croissent vers la droite et que les y croissent vers le haut.
Ex. 2. Écrire une fonction qui reçoit 4 points et qui vérifie si ces 4 points forment un carré horizontal. Ces 4 points étant respectivement le coin supérieur gauche, le point supérieur droit, le coin inférieur gauche et le coin inférieur droit.
Ex. 3. Écrire une fonction qui reçoit les valeurs de trois dés à six façes et qui vérifie que ces dés forment un 421.
Ex. 4. Écrire une fonction qui reçoit trois nombres et qui renvoie un tuple composé de ces trois nombres dans l’ordre croissant.
Ex. 5. Écrire une fonction qui reçoit trois nombres et qui renvoie les deux plus grands.
Solutions
Ex. 1.
def
is_in_rectangle(point,
upper_left,
lower_right):
""" vérifie si le point (tuple (x, y)) est dans le rectangle défini par ses coins supérieur gauche et inférieur droit"""
(x, y) = point
(x_1, y_1) = upper_left
(x_2, y_2) = lower_right
return (x >= x_1 and x <= x_2 and y >= y_2 and y <= y_1)
print(is_in_rectangle((1, 1), (0, 2), (3, 0))) #prints True print(is_in_rectangle((0, 0), (0, 2), (3, 0))) #prints True print(is_in_rectangle((-1, 0), (0, 2), (3, 0))) #prints False
Solution de l’exercice 2:
def
is_square(upper_l,
upper_r,
lower_l,
lower_r):
"""vérifie que le quadrilatere dont les 4 sommets sont upper_l, upper_r,
lower_l et lower_r, respectivement les coins supérieur gauche, supérieur droit, inférieur gauche et inférieur droit, forme un carré horizontal"""
(x_1, y_1) = upper_l (x_2, y_2) = upper_r (x_3, y_3) = lower_l (x_4, y_4) = lower_r
return (x_1 == x_3 and y_1 == y_2 and x_2 == x_4 and y_3 == y_4 and (x_2 - x_1) == (y_1 - y_3))
print(is_square((0, 1), (1, 1), (0, 0), (1, 0))) #prints True print(is_square((0, 1), (2, 1), (0, 0), (2, 0))) #prints False print(is_square((0, 1), (1, 1), (0, 0), (2, 0))) #prints False
Solution de l’exercice 3:
def
is_421(x,
y,
z):
"""vérifie que les trois entiers x,y et z forment un 421"""
return ((x == 4 or y == 4 or z == 4) and (x == 2 or y == 2 or z == 2) and (x == 1 or y == 1 or z == 1))
Solution naïve :
def
is_421(x,
y,
z):
"""vérifie que les trois entiers x,y et z forment un 421"""
flag = False
if x == 4 and y == 2 and z == 1:
flag = True
elif x == 4 and y == 1 and z == 2:
flag = True
elif x == 2 and y == 4 and z == 1:
flag = True
elif x == 2 and y == 1 and z == 4:
flag = True
elif x == 1 and y == 4 and z == 2:
flag = True
elif x == 1 and y == 2 and z == 4:
flag = True return flag
print(is_421(4,
2,
1))
#prints
True
print(is_421(4,
1,
2))
#prints
True
print(is_421(2,
4,
1))
#prints
True
print(is_421(2,
1,
4))
#prints
True
print(is_421(1,
4,
2))
#prints
True
print(is_421(4,
2,
2))
#prints
False
print(is_421(-1, 2.0, 4)) #prints False
Autre solution identique au niveau du flot d’exécution :
def
is_421(x,
y,
z):
"""vérifie que les trois entiers x,y et z forment un 421"""
return (x == 4 and y == 2 and z == 1 or x == 4 and y == 1 and z == 2 or x == 2 and y == 4 and z == 1 or x == 2 and y == 1 and z == 4 or x == 1 and y == 4 and z == 2 or x == 1 and y == 2 and z == 4)
Une autre solution plus rapide (analysez le flot d’éxécution) :
def
is_421(x,
y,
z):
"""vérifie que les trois entiers x,y et z forment un 421"""
flag = False if x == 4:
if y == 2:
if z == 1:
flag = True #ordre 4 2 1
elif y == 1:
if z == 2:
flag = True #ordre 4 1 2
elif x == 2:
if y == 4:
if z == 1:
flag = True #ordre 2 4 1
elif y == 1:
if z == 4:
flag = True #ordre 2 1 4
elif x == 1:
if y == 4:
if z == 2:
flag = True #ordre 1 4 2
elif y == 2:
if z == 4:
flag = True #ordre 1 2 4
return flag
Une solution plus élégante est de trier ces trois nombres avant de tester leurs valeurs comme fait dans l’exercice 4 : .
def
is_421(x,
y,
z):
"""vérifie que les trois entiers x,y et z forment un 421""" (x, y, z) = sort_3_items(x, y, z)
return x == 1 and y == 2 and z == 4
Solution basée sur le fait que les dés ont 6 faces de 1 à 6 :
def
is_421(x,
y,
z):
"""vérifie que les trois entiers x,y et z forment un 421"""
return (x + y + z == 7) and (x == 4 or y == 4 or z == 4)
Solution de l’exercice 4:
def
sort_3_items(x,
y,
z):
if x < y:
if y < z:
res = (x, y, z)
elif x < z:
res = (x, z, y)
else:
res = (z, x, y)
else:
if x < z:
res = (y, x, z)
elif y < z:
res = (y, z, x)
else:
res = (z, y, x)
return res
print(sort_3_items(1, 2, 3)) #prints (1, 2, 3) print(sort_3_items(1, 1, 1)) #prints (1, 1, 1) print(sort_3_items(3, 2, 1)) #prints (1, 2, 3) print(sort_3_items(1, 3, 2)) #prints (1, 2, 3) print(sort_3_items(3, 1, 1)) #prints (1, 1, 3)
Solution de l’exercice 5:
def
two_max(a,
b,
c):
if a < b and a < c: #a est le minimum
maximum = (b,c)
elif b < c: #b est le minimum
maximum = (a,c)
else: #c est le minimum
maximum = (a,b)
return maximum
print(two_max(1, 2, 3)) #prints (2, 3) print(two_max(2, 2, 3)) #prints (2, 3) print(two_max(1, 2, 2)) #prints (2, 2) print(two_max(3, 2, 1)) #prints (3, 2) print(two_max(1, 3, 2)) #prints (3, 2)