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 :

Un noob en cours d'apprentissage


Sujet :

Python

  1. #21
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    En fait la réponse est dans une erreur, regardez plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> int(raw_input("entrer :"))
    entrer :
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: ''
    Quand j'appuie sur la touche entrée sans résultat, une erreur de type ValueError apparaît.

    Ma boucle doit continuer de fonctionner tant que je n'ai pas cette erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> liste = []
    >>> while True: # Boucle infinie, dangereux, on doit toujours prévoir un break
    ...     try: # essaie
    ...         valeur = int(raw_input("Veuillez entrer une valeur :"))
    ...         liste.append(valeur) # ça fonctionne on ajoute à la liste
    ...     except ValueError: # une erreur s'est produite
    ...         print liste # affichage de la liste
    ...         break # on arrête la boucle
    ... 
    Veuillez entrer une valeur :5
    Veuillez entrer une valeur :3568
    Veuillez entrer une valeur :12
    Veuillez entrer une valeur :
    [5, 3568, 12]
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    J'avoue ne pas comprendre le raisonnement dans son intégralité...

    En lisant ceci, dois-je comprendre que mon script était totalement faux ?

    mon raisonnement de départ me semble pourtant plutôt logique....Except ValueError agit de quelle façon concrètement ? Est-ce que je demande à l'ordinateur de ne pas prendre en compte cette erreur ? J'en doute..

    de même si j'ai bien compris mon devrait normalement fonctionner.

    On dit souvent souvent que je comprends vite mais qu'il faut m'expliquer longtemps...J'espère ne pas abuser de votre temps

  3. #23
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    Votre erreur est d'affecter liste.append() à une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.append(votre_nombre) # suffira
    Le reste semble correct, mais la question que vous vous poserez est de détecter l'arrêt de la boucle.

    J'ai pris un peu d'avance
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Ce poste risque, peut-être, de vous embrouiller l'esprit car il est certainement trop tôt pour vous d'entendre parler de ce qui suit. Mais dans un souci de vérité je me permets de tenter d'éclaircir les faits.

    Sachez en premier lieu qu'en interne, pour Python, tout n'est que référence à des objets stockés en mémoire et il existe deux grandes familles d'objets : les modifiables et les non-modifiables. Les entiers (type int) sont eux des non-modifiables; ainsi lorsque vous additionnez un nombre à un autre cela créer un nouvel objet de type int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> a = 1
    >>> a = a + 1
    >>> a
    2
    >>> id(a) # identificateur unique de l'objet <a> (enfin ce à quoi <a> réfère)
    505510760
    >>> a = a + 5
    >>> a
    7
    >>> id(a)
    505510840 # a ne fait plus référence au même objet
    Alors que les objets de type list sont eux des objets modifiables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> ls = []
    >>> id(ls)
    45895152
    >>> ls.append(None)
    >>> ls
    [None]
    >>> id(ls)
    45895152 # il s'agit toujours du même objet
    >>> ls[0] = "Hello"
    >>> ls
    ['Hello']
    >>> id(ls)
    45895152 # là encore...
    Bon, tout ceci n'a pas de rapport direct avec votre problème actuel mais il s'agit là d'un point extrêmement important à propos de Python lorsque l'on aborde les objets modifiable tels que les listes, et vous vous en rendrez compte bientôt.

    Pour en revenir à l'instruction qui vous pose actuellement problème; les méthodes peuvent (mais n'y sont pas obligées) agir directement sur leur objet et le modifier (s'ils sont modifiables ou simplement changer leur référence s'ils ne le sont pas) sans avoir besoin de retourner quoique ce soit (en réalité elle retourne alors un objet de type NoneType nommé None) et c'est pour cela que la méthode append(...) des listes retourne None car avec cette instruction :
    ls devient la référence à None et par conséquent vous perdez la référence à la liste que vous venez de remplir.

  5. #25
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    L'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'NoneType' object has no attribute 'append'
    est produite par l'entrée du 2ième entier à cause de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = liste.append(valeur)
    liste.append retournant None, vous aurez 'NoneType' object...
    liste.append(valeur) sans assignation "suffit".

    C'est ce que raconte "PsycoPy" de façon "compliquée".

    L'erreur que vous n'aviez pas encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValueError: invalid literal for int() with base 10: ''
    se produira lorsque vous indiquerez la fin des entrées par un "return".
    La chaine de caractère retournée par raw_input sera alors vide et sa conversion en "int" plantera.
    C'est ce que raconte "fred1599".

    En lisant ceci, dois-je comprendre que mon script était totalement faux ?
    Un script est rarement faux: il fait ce que vous attendez (ou pas) et comme vous débutez, il fait des choses inattendues.

    Comme les débutants se cognent les mêmes tutos, ils tombent dans les mêmes pièges,... A force, c'est fastoche de les connaître!
    De votre côté, prenez le temps d'apprendre et de poser des (bonnes) questions.

    Les vieux posts sont généralement lus par ce qui y ont initialement répondu, il serait préférable de les marquer "résolu" lorsque vous avez obtenu une réponse satisfaisante: créez de nouveaux posts pour les nouveaux sujets. N'oubliez pas d'inclure le code que vous avez produit!

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

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Encore une fois, merci pour ce flot de réponse aussi intéressant les uns que les autres ! De mon côté je trouvais ça intéressant de conserver ma progression à travers un seul et unique poste et puis ça évite de polluer le forum si j'ai une question à chaque exercice non ?

    D'un autre point vue, ces multiples questions seront peut être utile à d'autres débutants comme moi me direz-vous....Si vous insistez pour que je créer un nouveau sujet à chacune de mes questions et bien soit ! Je me plierais à votre volonté

    Psycopy, je mentirais si je disais que tout me semble claire comme de l'eau de roche dans votre messages, néanmoins je prendrais le temps de l'étudier avec rigueur histoire d'en comprendre tout le sens ! Merci.

    Maintenant tâchons de résoudre cet exercice, et avec les lumières apportées je ne doute pas que la victoire sera mienne ce soir ! Zou ! On retourne au charbon.:cool:

    ps :

    moi j'ai droit à une erreur de syntaxe

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Wiztricks, votre commentaire m'a beaucoup aidé :

    Un script est rarement faux: il fait ce que vous attendez (ou pas) et comme vous débutez, il fait des choses inattendues.
    la première fois que j'ai lu ce commentaire il était passé totalement inaperçu, la seconde fois par contre je me suis dit :

    plutôt que de m'enticher à aller dans cette direction pourquoi est ce que je n'essaierais pas de voir le problème sous un autre angle, trouver d'autres pistes de solutions..C'est la que je me suis dit si plutôt que d'avoir une boucle qui me dit que :

    Tant que ma valeur est >= 0 alors
    si elle me disait :

    Tant que ma valeur est != "" alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    valeur = int(raw_input("entrer une valeur:"))
    liste = []
    while valeur != "":
        valeur = int(raw_input("entrer une valeur:"))
        liste.append(valeur)
    if valeur == "":
        print(liste)
    mhhh que vois-je :

    ValueError: invalid literal for int() with base 10: ''
    Très bien alors si je supprimais int() tout simplement ? Car oui, effectivement "" n'est pas de type int() alors forcément...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    valeur = (raw_input("entrer une valeur:"))
    liste = []
    while valeur != "":
        valeur = (raw_input("entrer une valeur:"))
        liste.append(valeur)
    if valeur == "":
        print(liste)
    Hey ça fonctionne !!!

    entrer une valeur:45
    entrer une valeur:56
    entrer une valeur:78
    entrer une valeur:89
    entrer une valeur:
    ['56', '78', '89', '']
    Arf, non pas tout à fait ! ma première valeur n'est pas enregistrer dans la liste. Alors si plutôt que d'avoir une liste vide, j'avais une liste qui contenait déjà ma variable valeur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    valeur = (raw_input("entrer une valeur:"))
    liste = [valeur]
    while valeur != "":
        valeur = (raw_input("entrer une valeur:"))
        liste.append(valeur)
    if valeur == "":
        print(liste)
    Bingo !

    entrer une valeur:34
    entrer une valeur:45
    entrer une valeur:56
    entrer une valeur:76
    entrer une valeur:
    ['34', '45', '56', '76', '']
    conclusion, il y a en programmation 1001 façon d'atteindre ses fins ? de la plus simple, à la plus compliqué en passant par la plus efficace ? J'avoue éprouver de plus en plus de plaisir....Voila qui est bien étrange !

    Au fait, merci pour les Cours et tutoriels Python , en particulier celui la est trop top : Apprendre à programmer avec Python 3 par Gérard Swinnen


  8. #28
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par suppadrakn Voir le message
    conclusion, il y a en programmation 1001 façon d'atteindre ses fins ? de la plus simple, à la plus compliqué en passant par la plus efficace ? J'avoue éprouver de plus en plus de plaisir....Voila qui est bien étrange !
    C'est la grande 'souplesse' de Python. En Python vous êtes considéré comme 'responsable' de votre code vous avez donc le droit de faire (presque) toutes les 'constructions' qui vous chante.
    Pour ce qui est de la plus 'efficace' c'est votre trésor de guerre, votre livre de recettes : C'est l'expérience.

    Pour en revenir au code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while valeur != "":
        <code>
    if valeur == "":
        <code>
    La condition pour sortir de while étant valeur != "" pas besoin de tester avec if: valeur == "".

    ['34', '45', '56', '76', '']
    Vous ajoutez '' à votre liste, dommage.
    Pour cela vous pouvez tester si c'est un nombre avant l'append avec la méthode str.isdigit().

    if valeur == ""
    Le code est bon mais vous pourriez écrire if valeur / if not valeur.
    Cela vous sera utile pour les comparaisons booléennes.

    Un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    liste = []
    while True:
        valeur = raw_input("entrer une valeur: ")
        if not valeur:
            break
        if not valeur.isdigit():
            print("Un chiffre svp.")
            continue
        liste.append(int(valeur))
    print(liste)
    On rajoute les notions de break/continue mais la liste finale est propre.
    Explication de code:
    Tant que c'est vrais on boucle. Puisque True est vrais cela ne s’arrête pas.
    Vous en comprendrez le danger si la notion de 'comment on s'en sort' n'est pas nette.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        valeur = raw_input("entrer une valeur: ")
        if not valeur:
            break
    C'est le même principe que pour while. Si valeur est pas '' alors valeur est False. Dans ce sens if valeur != '' correspond à if valeur is not False et if valeur == '' à if not valeur.
    break arrête la boucle (utilisable avec while et for).
    Nous avons notre porte de sortie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if not valeur.isdigit():
            print("Un chiffre svp.")
            continue
        liste.append(int(valeur))
    if not valeur.isdigit() est sur le même principe: valeur.isdigit() retourne True ou False.
    continue permet de revenir au while sans exécuter le reste du code.
    Si vous n'avez rien a faire du print cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste = []
    while True:
        valeur = raw_input("entrer une valeur: ")
        if not valeur:
            break
        if valeur.isdigit():
            liste.append(int(valeur))
    print(liste)
    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #29
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par josmiley Voir le message
    avec python 3 print est devenu une fonction, donc il faut des parenthèses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # -*- coding: utf-8 -*-
    from math import*
    # programme permettant de calculer le périmètre et l'air d'un triangle
    a = int(raw_input("entrer la valeur du premier cote en cm:"))
    b = int(raw_input("entrer la valeur du second cote en cm:"))
    c = int(raw_input("entrer la valeur du troisieme cote en cm:"))
    perimetre = 0
    air = 0
    if a > 0 and b > 0 and c > 0:
        perimetre = a + b + c
        print("le perimetre du triangle est :", perimetre, "cm")
    else:
        print("ce calcul est impossible")
     
    d = perimetre / 2
    air = sqrt(d * (d - a) * (d - b) * (d - c))
    print("l\'air du triangle est de :", air, "cm2")
    Il n'y a que moi que cela choque ?

    @+
    Merci d'utiliser le forum pour les questions techniques.

  10. #30
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,
    Citation Envoyé par PauseKawa Voir le message
    Il n'y a que moi que cela choque ?
    A la lecture de l'historique, impossible de savoir si le PO travaille, in fine, avec Python v3 ou Python v2. C'est un défaut des discussions qui couvrent plusieurs sujets: on ne sait plus trop ou on en est, ce qui est nouveau/ancien/résolu/abandonné
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Les meilleurs cours et tutoriels C++
    Par Community Management dans le forum C++
    Réponses: 1
    Dernier message: 13/05/2015, 13h50
  2. Réponses: 1
    Dernier message: 11/04/2010, 18h27
  3. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  4. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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