Aide Python : fonction factorielle qui retourne None

Résolu
Rica -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    1. Rica
       
      Merci pour l'aide et bonne soirée !
      0
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944 > Rica
         
        À toi également, bonne continuation :-)
        0