Résumé en français : 2 paramètres entiers vous sont donnés, par exemple 1 et 9, le premier étant toujours inférieur au second (mais ils peuvent être négatifs). Vous devez trouver combien de nombres sont entre les 2 sachant qu’ils ne doivent pas contenir de ‘5’.
def dont_give_me_five(debut, fin):
compteur = 0
for v in range(debut, fin+1):
if '5' not in str(v):
compteur += 1
return compteur
dont_give_me_five(4, 17)
12
Cette version a le mérite d’être simple à comprendre. On initialise un compteur à zéro et on parcourt la liste complète des nombres entre debut et fin (avec un +1 pour inclure la valeur fin). Pour savoir si 5 est ou n’est pas dans le nombre, on transforme le nombre v en chaine de caractères (str) et on teste si le caractère ‘5’ n’est pas dans cette chaine. C’est beaucoup plus facile que de le faire avec des formules mathématiques ! Si c’est vrai que ‘5’ n’est pas dans la chaine, le compteur augmente de 1.
Remarquons qu'en Python True
vaut 1 et False
vaut 0, ce qui permet d'effectuer des calculs :
True + True
2
True + False
1
D’où cette seconde version :
def dont_give_me_five(debut, fin):
return sum(['5' not in str(i) for i in range(debut, fin + 1)])
dont_give_me_five(1, 9)
8
'5' not in str(i)
donnera True
ou False
suivant que le caractère 5
est ou n'est pas dans le nombre. Remarquon pour finie l'on peut même faire la somme sans écrire les crochets :
def dont_give_me_five(debut, fin):
return sum('5' not in str(i) for i in range(debut, fin + 1))