Aide Python : fonction factorielle qui retourne None

Résolu/Fermé
Rica - Modifié le 4 mai 2021 à 23:43
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 5 mai 2021 à 00:11
Bonsoir,

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

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 4 mai 2021 à 23:46
Bonjour,

Si ton programme ne rentre pas dans la boucle
while
(ce qui est le cas pour toute valeur de
n
supérieure ou égale à 1) de la fonction
factorielle
, alors l'instruction
return W
n'est jamais atteinte et par défaut, python quitte la fonction factorielle en retournant
None
.

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}.")


... en
numpy
:

#!/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
1
Merci pour l'aide et bonne soirée !
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > Rica
5 mai 2021 à 00:11
À toi également, bonne continuation :-)
0