IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

erreur compréhension liste


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    domaine automobile
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : domaine automobile
    Secteur : Transports

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut erreur compréhension liste
    Bonjour

    je dois écrire une fonction qui prend comme un nombre entier m et un nombre flottant b, et qui renvoie une liste contenant les nombres allant de b^0 à b^{m - 1}.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def my_pow (m,b):
        if m is int and b is float:
            res = [(m,b) for k in range(m+1,1) (b**(m-1))]
            return res
    voici l'erreur:

    TypeError: 'range' object is not callable
    une idée ?

    merci d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Probablement que tu utilises déjà le terme range ailleurs dans ton code.

    Et change ceci if m is int and b is float: par if isinstance(m, int) and isinstance(b, float):

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si on écrit range(...)(...), les premières parenthèses appellent range et retournent un objet. Les 2ème parenthèses provoquent l'appel de cet objet et le message d'erreur.

    Pour le reste, une liste qu'on remplit à chaque itération avec des .append est une écriture valide et à maîtriser avant de passer aux compréhensions de listes.

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

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par amfortaf Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def my_pow (m,b):
        if m is int and b is float:
            res = [(m,b) for k in range(m+1,1) (b**(m-1))]
            return res
    voici l'erreur:

    TypeError: 'range' object is not callable
    Ton code ne correspond pas à l'erreur citée. Vu que m is int et/ou b is float est toujours faux, le code ne passe même pas par ce range() foireux et ressort None. En effet, 5 (par exemple) n'est pas int, 5 est un int. Désolé si cette précision te semble du pinaillage mais Python n'admet pas "l'à peu près".
    Et si par hasard on appelle la fonction avec les vrais types "int" et "float", alors ça plante sur m+1.
    if isinstance(m, int) and isinstance(b, float).

    Pour le reste wiztricks a raison. Tu veux créer une liste en intension sans avoir l'habitude, tu commences par la créer de façon classique et seulement de là tu peux alors basculer la boucle et le test.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Homme Profil pro
    domaine automobile
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : domaine automobile
    Secteur : Transports

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Ton code ne correspond pas à l'erreur citée. Vu que m is int et/ou b is float est toujours faux, le code ne passe même pas par ce range() foireux et ressort None. En effet, 5 (par exemple) n'est pas int, 5 est un int. Désolé si cette précision te semble du pinaillage mais Python n'admet pas "l'à peu près".
    Et si par hasard on appelle la fonction avec les vrais types "int" et "float", alors ça plante sur m+1.
    if isinstance(m, int) and isinstance(b, float).

    Pour le reste wiztricks a raison. Tu veux créer une liste en intension sans avoir l'habitude, tu commences par la créer de façon classique et seulement de là tu peux alors basculer la boucle et le test.
    Bonjour,

    Vous avez raison, voici le code simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    def my_pow (m, b):
        res =[]
        if isinstance(m, int) and isinstance(b, float):
            for i in range(0, m):
                res.append(b**i)
            return res
        else:
            return None
     
    my_pow(3, 5.0)  -->  [1, 5, 25]

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amfortaf Voir le message
    Vous avez raison, voici le code simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def my_pow (m, b):
        res =[]
        if isinstance(m, int) and isinstance(b, float):
            for i in range(0, m):
                res.append(b**i)
            return res
        else:
            return None
    Yep. j'ai écrit isinstance(b, float) pour voir si tu percuterais et malheureusement...
    En mathématique les ensembles des nombres sont imbriqués. Il y a d'abord les naturels, puis les relatifs. Et les relatifs incluent les naturels. Donc un nombre naturel est aussi un nombre relatif. Ensuite il y a les décimaux qui incluent les relatifs donc un naturel qui est aussi un relatif est aussi un décimal. Et etc etc.
    Ben en informatique c'est pareil. 5.0 est un flottant, mais 5 l'est aussi (enfin devrait être vu comme tel). Si la fonction accepte 5.0, elle devrait alors pouvoir accepter 5 (sauf si ça a été explicitement interdit dans l'énoncé). Et là, ta fonction n'accepte pas 5...

    Ensuite elle est où la compréhension de liste ? Elle se fait en remplaçant un algo de ce type
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab=[]
    for i in iterable:
        if test(i) == valeur_attendue: tab.append(travail(i))
    Par tab=[travail(i) for i in iterable if test(i) == valeur_attendue].
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2011, 20h23
  2. [XL-2003] Erreur VBA liste déroulante vide
    Par Goodjet dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/04/2010, 10h58
  3. Mon ftp ( erreur fonction list )
    Par my008 dans le forum Débuter
    Réponses: 1
    Dernier message: 18/05/2009, 12h03
  4. erreur sur liste déroulante
    Par pigeon11 dans le forum Struts 1
    Réponses: 2
    Dernier message: 27/09/2007, 09h03
  5. [PHP-JS] gestion des erreurs sur liste déroulente
    Par HwRZxLc4 dans le forum Langage
    Réponses: 9
    Dernier message: 28/05/2006, 03h21

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