Aide Python : fonction factorielle qui retourne None
Résolu
Bonsoir,
Le résultat que j'ai en sorti pour factorielle(n) est "None", Je ne comprends pas pourquoi j'ai cela, quelqu'un aurait l'aimabilité de m'expliquer et de me corriger également ?
def main():
n = int(input("Entrez un nombre N : "))
print("Votre nombre", n, "factorielle est", factorielle(n), ".")
def factorielle(n):
z = 1
while 1 > n:
W = z * n
n = n - 1
return W
main()
Le résultat que j'ai en sorti pour factorielle(n) est "None", Je ne comprends pas pourquoi j'ai cela, quelqu'un aurait l'aimabilité de m'expliquer et de me corriger également ?
1 réponse
-
Bonjour,
Si ton programme ne rentre pas dans la bouclewhile
(ce qui est le cas pour toute valeur den
supérieure ou égale à 1) de la fonctionfactorielle
, alors l'instructionreturn W
n'est jamais atteinte et par défaut, python quitte la fonction factorielle en retournantNone
.
Donc dans l'esprit ton code devrait plutôt ressembler à :
#!/usr/bin/env python3 def factorielle(n): produit = 1 i = 1 while i <= n: produit *= i # ou : produit = produit * i i += 1 # ou : i = i + 1 return produit n = int(input("Entrez un nombre N : ")) print(f"Votre nombre {n} factorielle est {factorielle(n)}.")
Après, tu peux l'écrire plus simplement :
#!/usr/bin/env python3 def factorielle(n): produit = 1 for i in range(1, n + 1): produit *= i return produit n = int(input("Entrez un nombre N : ")) print(f"Votre nombre {n} factorielle est {factorielle(n)}.")
Personnellement, j'écrirais tout simplement :
#!/usr/bin/env python3 import math n = int(input("Entrez un nombre N : ")) f = math.factorial(n) print(f"Votre nombre {n} factorielle est {f}.")
D'autres version sont envisageables, par exemple
... sous forme récursive :
#!/usr/bin/env python3 from functools import reduce def factorielle(n): assert n > 0 return ( 1 if n == 0 or n == 1 else n * factorielle(n - 1) ) n = int(input("Entrez un nombre N : ")) f = factorielle(n) print(f"Votre nombre {n} factorielle est {f}.")
... ennumpy
:
#!/usr/bin/env python3 import numpy as np n = int(input("Entrez un nombre N : ")) f = np.prod([i for i in range(1, n + 1)]) print(f"Votre nombre {n} factorielle est {f}.")
... ou plus alambiqué, en map/reduce :#!/usr/bin/env python3 from functools import reduce n = int(input("Entrez un nombre N : ")) f = reduce( lambda x, y: x * y, (i for i in range(1, n + 1)) ) print(f"Votre nombre {n} factorielle est {f}.")
Bonne chance