1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2017
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Fonction python qui ne fonctionne pas correctement

    Bonjour,

    Dans le cadre d'une étude scientifique, je souhaiterais accumuler dans une liste plusieurs valeurs dépendant de trois paramètres variables (k, l et p) et d'un paramètre fixé (m) argument de la fonction.
    Pour cela je procède par trois boucles for imbriqués:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def collecteur(m):
    L=[]
    for k in range(1,int(m/2)+1):
    for l in range(k):
    if (k-l)%3==0:
    for p in range(((2*(k-l))//3),int((min(m, 3*(k-l)))/3)):
    L.append(((fact(m))/((fact(l))*(fact(k-l))*(fact(m-2*l-3*p))*(2**l))))
    else:
    for p in range(1+int((2*(k-l))/3),int((min(m, 3*(k-l)))/3)):
    L.append(((fact(m))/((fact(l))*(fact(k-l))*(fact(m-2*l-3*p))*(2**l))))
    return L
    Pour calculer les termes que je veux rentrer dans la liste, j'ai utilisé la fonction fact suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def fact(n):
    """fact(n): calcule la factorielle de n (entier >= 0)"""
    x=1
    for i in range(2,n+1):
    x*=i
    return x
    Cependant j'ai trouvé (en calculant sur le papier la fonction collecteur) une liste par exemple pour m=5 de longueur 6. Or sous python 3.6.1 ou python 2.7, idle me ressort la liste vide []. Je ne comprends pas pourquoi les termes ne s'accumulent pas dans la liste L pour m=5. Par ailleurs plusieurs valeurs de m me ressortent une liste vide, et quand je prends par exemple m=12 ou 13 j'obtiens une liste de longueur 3 (alors que la liste devrait être bien plus grande).

    Si vous pouvez m'aider à trouver la source de l'erreur,
    Bien cordialement.

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 436
    Points : 17 088
    Points
    17 088

    Par défaut

    Salut,

    Citation Envoyé par Bipolaire Voir le message
    Si vous pouvez m'aider à trouver la source de l'erreur
    Lisez votre code...
    Si la liste retournée est vide c'est qu'on ne lui a jamais ajouté d'élément i.e. que l'instruction L.append(..) n'a pas été exécutée.
    Cela posé, c'est que dans la construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for p in range(...):
         L.append(...)
    la suite retournée par range(...) est vide.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> for p in range(2, 2):
    ...     print (p)
    ...
    >>>
    et rien ne s'affiche...
    note: si la borne de départ est >= à la borne de fin... c'est vide.

    Après pour savoir ce qu'il faudrait mettre à la place de ((2*(k-l))//3),int((min(m, 3*(k-l)))/3) pour que ce soit moins vide, je ne suis pas dans votre tête...
    Mais vous pouvez commencer par vérifier que mes déductions sont justes en affichant la valeurs des bornes avec l'instruction magique "print".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2017
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Effectivement le problème venait simplement du fait que range(x,x) est vide. Il suffisait de prendre range(x,x+1) car range(a,b)=[a,...b-1].

    Merci de votre aide.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    novembre 2010
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 315
    Points : 6 202
    Points
    6 202

    Par défaut

    Citation Envoyé par Bipolaire Voir le message
    edited
    bravo, bel esprit.
    Avant donc que d'écrire, apprenez à penser.
    Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
                                                        - Nicolas Boileau, L'Art poétique

Discussions similaires

  1. fonction JS qui ne fonctionne pas correctement
    Par SI_BDD dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 24/02/2014, 17h00
  2. Un test if qui ne fonctionne pas correctement
    Par Shinjuku dans le forum Fonctions
    Réponses: 6
    Dernier message: 26/02/2008, 11h52
  3. Fonction mysql qui ne fonctionne pas pour un ancien postgreIste
    Par floreasy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/01/2008, 19h49
  4. [SQL] Fonction SUM qui ne fonctionne pas !
    Par nigg4z dans le forum PHP & SGBD
    Réponses: 15
    Dernier message: 11/10/2007, 17h20
  5. Fonction While {} qui ne fonctionne pas
    Par zoom61 dans le forum Fonctions
    Réponses: 3
    Dernier message: 15/11/2006, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo