Avis et correction d'un exercice
Bonjour tout le monde,
J'ai trouvé un exercice assez intéressant sur le site www.codewars.com
Voici l'énoncé :
This time we want to write calculations using functions and get the results. Let's have a look at some examples:
seven(times(five())) # must return 35
four(plus(nine())) # must return 13
eight(minus(three())) # must return 5
six(divided_by(two())) # must return 3
Requirements:
- There must be a function for each number from 0 ("zero") to 9 ("nine")
- There must be a function for each of the following mathematical operations: plus, minus, times, divided_by
- Each calculation consist of exactly one operation and two numbers
- The most outer function represents the left operand, the most inner function represents the right operand
- Division should be integer division. For example, this should return
2, not2.666666...:
eight(divided_by(three()))
L'exercice commence comme ça:
def zero(): # your code here
def one(): # your code here
def two(): # your code here
def three(): # your code here
def four(): # your code here
def five(): # your code here
def six(): # your code here
def seven(): # your code here
def eight(): # your code here
def nine(): # your code here
def plus(): # your code here
def minus(): # your code here
def times(): # your code here
def divided_by(): # your code here
Et il faut coder toutes les fonctions données.
Voici ma solution, elle est fonctionnelle et a passé tous les tests du site pour valider l'exercice
def zero(*args) -> int: # your code here
return return_value(0, *args)
def one(*args) -> int: # your code here
return return_value(1, *args)
def two(*args) -> int: # your code here
return return_value(2, *args)
def three(*args) -> int: # your code here
return return_value(3, *args)
def four(*args) -> int: # your code here
return return_value(4, *args)
def five(*args) -> int: # your code here
return return_value(5, *args)
def six(*args) -> int: # your code here
return return_value(6, *args)
def seven(*args) -> int: # your code here
return return_value(7, *args)
def eight(*args) -> int: # your code here
return return_value(8, *args)
def nine(*args) -> int: # your code here
return return_value(9, *args)
def return_value(number: int, *args) -> int:
"""Function created to avoid code repetition for other functions from 0 to 9"""
if args:
operator, second_number = args[0]
return eval(str(number) + operator + second_number)
return number
def plus(number: int) -> tuple[str, str]: # your code here
return "+", str(number)
def minus(number: int) -> tuple[str, str]: # your code here
return "-", str(number)
def times(number: int) -> tuple[str, str]: # your code here
return "*", str(number)
def divided_by(number: int) -> tuple[str, str]: # your code here
return "//", str(number)
Comme je le disais, ma solution fonctionne
J'ai créé une fonction supplémentaire (return_value) pour éviter de répéter le même code dans toutes les fonctions de 0 à 9
J'ai utilisé les *args mais je ne sais pas si je les ai utilisé de la bonne manière
Je voudrais juste avoir vos avis sur mon code et si vous avez de meilleures solutions pour résoudre l'exercice
Merci,
Romuad
Salut Romuald,
je ne suis pas sur de ce que tu voulais faire avec la fonction return_value.
Le *args te permet de pouvoir ajouter d'autres paramètres dans ta fonction dynamiquement. Or ici à chaque tu ne prends que le premier des arguments supplémentaires. Avec ta condition, dès que tu entres plus que un paremetre, qui correspond à ton paramètre "Number", il ne te l'affichera pas et afficheras uniquement les autres paramètres. Cf exemple ci dessous.
In [14]: def return_value(number: int, *args) -> int:
...: if args:
...: return f"dynamic params only {[elem for elem in args]}"
...: else:
...: return f"first postionnal param {number}"
In [15]: return_value(3)
Out[15]: 'first postionnal param 3'
In [16]: return_value(3, 6, 9)
Out[16]: 'dynamic params only [6, 9]'
A ta disposition et n'hésites, j'ai peut être mal compris ton intention.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte