def plus_petite(n1, n2):
if n1 < n2:
pp = n1 # on utilise une variable 'pp' qui contiendra le résultat à renvoyer
elif n2 < n1:
pp = n2
else:
pp = n1, n2 # si les deux valeurs sont identiques, on les renvoie toutes les deux !
return pp
print("La valeur la plus petite est", plus_petite(15, 23))
Il est à noter que l'on peut très bien se passer de la variable pp, et utiliser à la place directement plusieurs instructions return
à différents endroits de la fonction :
def plus_petite(n1, n2):
if n1 < n2:
return n1
elif n2 < n1:
return n2
else:
return n1, n2
print("La valeur la plus petite est", plus_petite(15, 23))
Il y a bien 3 cas à évaluer ici : pensez au cas où les deux valeurs sont égales !
Avec la même "astuce" que ci-dessus :
def plus_longue(chaine1, chaine2):
l1 = len(chaine1) # on détermine tout d'abord le nombre de caractères de chacune des chaînes
l2 = len(chaine2)
if l1 < l2: # on fait ensuite les tests sur leur longueur
return "La plus longue chaîne est " + chaine2 + " avec " + l1 + " caractères."
elif l2 < l1:
return "La plus longue chaîne est " + chaine1 + avec " + l2 + " caractères."
else:
return "Les deux chaînes sont de même longueur : " + l1 + " caractères."
print(plus_longue("ababab", "bababababab"))
Ici, on construit directement une chaîne à renvoyer, formée de la concaténation de deux autres chaînes; il n'y a alors qu'à afficher directement le résultat renvoyé par la fonction.
def calcul_imc(taille, poids):
imc = poids / (taille**2) # calcul de la valeur de l'imc
if (imc < 18.5):
return imc, "poids insuffisant."
elif (imc >= 18.5 and imc < 25):
return imc, "poids normal."
elif ( imc >= 25 and imc < 30):
return imc, "surpoids."
else :
return imc, "obésité."
t = float(input("Entrez votre taille en m : "))
p = int(input("Entrez votre poids en kg: "))
res1, res2 = calcul_imc(t, p) # appel de la fonction, et stockage de ses résultats renvoyés dans deux variables : imc -> res1, chaine -> res2
print("Votre IMC est", res1)
print("Vous êtes en", res2)
imc
lorsqu’on cherche à savoir si sa valeur est dans un certain
intervalle, par exemple ligne 7 ), il est nécessaire de répéter pour chaque évaluation le nom de la variable.
elif (imc >= 18.5 and < 25):
else
( ligne 11 ), on pouvait "insister" pour être certain sur la condition à évaluer :
elif (imc >= 30):
return imc, "Obésité."
...mais cela n'est pas nécessaire, car tous les autres cas ont été évalués précédemment, il s'agit donc bien ici d'un SINON.
def compte_caractere(txt, car):
compteur = 0 # variable auxiliaire servant de compteur de caractères
for lettre in txt : # pour chaque lettre du texte :
if lettre == car : # si la lettre courante est identique au caractère recherché,
compteur = compteur + 1 # alors on incrémente le compteur
return compteur
long_texte = "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatu"
caractere = 'e'
res = compte_caractere(long_texte, caractere) # appel de la fonction, et stockage de son résultat renvoyé
print("Le caractère", caractere, "se trouve", res, "fois dans le texte.")
for car in texte
: elle parcourt la chaîne texte
caractère après caractère, et stocke à chaque tour le caractère courant dans la variable car
.if
( ligne 6 ) doit être exécutée à chaque tour de boucle ( donc pour chaque caractère ), elle est donc en retrait par rapport au mot-clé for
;
de même, l'incrémentation du compteur ( ligne 7 ) ne doit être exécutée que si la condition évaluée par le if
est vraie, elle est donc indentée par rapport au if
.
for lettre in txt :
if (lettre == car) :
compteur = compteur + 1
...le compteur aurait été incrémenté à chaque tour de la boucle : cette variable contiendrait alors le nombre total de caractère du texte à la fin du parcours de la chaîne !
def est_bissextiel(annee):
if ( annee % 4 == 0 and annee % 100 !=0 or annee % 400 == 0 ) :
return True
else :
return False
print(est_bissextile(2022))
if ( annee % 4 == 0 and annee % 100 !=0) :
return True
elif ( annee % 400 == 0 ) :
return True
else :
return False
En fait, il y a généralement plusieurs façons d'écrire un code qui fasse la même chose, à condition de respecter la logique de ce que l'on veut faire.
La différence entre ces différentes façons est une question d'optimisation, c'est à dire écrire judicieusement un code en utilisant toutes les possibilités du langage.
return
, on peut placer toute expression,
c'est à dire une combinaison de symboles qui est égale à un certain résultat; ce peut être une simple valeur, une variable, ou alors un calcul, etc..if
:
def est_bissextile(annee):
return ( annee % 4 == 0 and annee % 100 !=0 or annee % 400 == 0 ) # on renvoie directement le résultat de l'évaluation de la condition !
print(est_bissextile(2022))
Et oui, ça marche très bien ! L'évaluation d'une condition est une expression donnant True
ou False
comme résultat, aucun problème donc à l'utiliser avec un return
!
Pensez à cela dès qu'une de vos fonctions doit renvoyer le résultat de n'importe quelle expression, on peut très souvent éviter d'utiliser des variables intermédiaires.
Comme l'a dit le grand théoricien de l'algorithmique Donald Knuth :
"Premature optimization is the root of all evil (or at least most of it) in programming." ( L'optimisation prématurée est la racine de tous les maux (ou, du moins, la plupart d'entre eux) en programmation. )
Suivez ce conseil, et écrivez d'abord votre code en réfléchissant à la logique de ce que vous voulez faire, même si cela ne vous paraît pas très "élégant". Ensuite, éventuellement, et seulement si vous maîtrisez cela, vous pourrez réfléchir à l'optimisation de votre code afin d'améliorer sa clarté.
Comme indiqué dans la consigne, on va donc réutiliser la fonction précédente en l'appelant à l'étape concernée de l'algorithme :
def est_bissextile(annee):
# code repris de l'exercice précédent
return ( annee % 4 == 0 and annee % 100 !=0 or annee % 400 == 0 )
def jour_date(siecle, an, jour, mois, annee):
#application de la formule de l'étape 3 au calcul de la variable 'valeur'
valeur = an + an // 4
# appel de la fonction est_bissextile, et stockage de son résultat dans une variable 'bissext'
bissext = est_bissextile(annee)
# test sur le siècle
if siecle == 18 :
valeur = valeur + 2
elif siecle == 20 :
valeur = valeur + 6
#tests sur le mois
if (mois == 1) and (bissext == False ) : # mois = janvier et année pas bissextile ?
valeur = valeur + 1
if (mois == 2): # mois = février ?
if bissext == True: # Deuxième test imbriqué dans le précédent
valeur = valeur + 3
else :# sous-entendu : si bissext == Faux...
valeur = valeur + 4
if (mois == 3) or (mois == 11) :
valeur = valeur + 4
if mois == 5 :
valeur = valeur + 2
if mois == 6 :
valeur = valeur + 5
if mois == 8 :
valeur = valeur + 3
if mois == 10 :
valeur = valeur + 1
if (mois == 9) or (mois == 12 ):
valeur = valeur + 6
valeur = ( valeur + jour ) % 7
#détermination du jour en fonction de la valeur de la variable 'valeur'
if valeur == 1 :
jr ='dimanche'
if valeur == 2 :
jr ='lundi'
if valeur == 3 :
jr ='mardi'
if valeur == 4 :
jr ='mercredi'
if valeur == 5 :
jr ='jeudi'
if valeur == 6 :
jr ='vendredi'
if valeur == 0 :
jr ='samedi'
# renvoi du résultat
return jr
print(jour_date(20, 22, 1, 10, 2022)) # appel de la fonction pour la date du 01/10/2022
if (mois == 2) and (bissex == True) :
valeur+=3
elif (mois == 2) and (bissex == False) :
valeur+=4