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 :

Besoin de piste pour un exercice


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut Besoin de piste pour un exercice
    Bonjour à tous, je suis entrain de lire le pdf de Gerard Swinnen "Apprendre a programmer avec Python 3" et je suis bloqué à un exercice :

    ".Tâchez d'écrire une petite fonction trouve() qui fera exactement le contraire de ce que fait l'opérateur d'indexage
    (c'est-à-dire les crochets [ ]). Au lieu de partir d'un index donné pour retrouver le caractère correspondant, cette
    fonction devra retrouver l'index correspondant à un caractère donné.
    En d'autres termes, il s'agit d'écrire une fonction qui attend deux arguments : le nom de la chaîne à traiter et le
    caractère à trouver. La fonction doit fournir en retour l'index du premier caractère de ce type dans la chaîne. Ainsi
    par exemple, l'instruction :
    print(trouve("Juliette & Roméo", "&"))
    devra afficher : 9
    Attention : il faut penser à tous les cas possibles. Il faut notamment veiller à ce que la fonction renvoie une valeur
    particulière (par exemple la valeur -1) si le caractère recherché n'existe pas dans la chaîne traitée. Les caractères
    accentués doivent être acceptés."

    Avez-vous des pistes ?

    Merci

  2. #2
    Membre éprouvé Avatar de jisig
    Homme Profil pro
    null
    Inscrit en
    Avril 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Indonésie

    Informations professionnelles :
    Activité : null

    Informations forums :
    Inscription : Avril 2014
    Messages : 146
    Par défaut
    méthode index ?

    ou si tu dois le faire manuellement, peut-être le gérer comme une liste :p

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    Oui mais je crois qu'on n'a pas encore vu les index.

    Justement j'y ai pensé a extraire chaque caractère pour les mettre dans une liste pour mieux les manipuler, mais rien ne me viens pour la suite.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Parcourir ta chaine, caractère après caractère, en faisant incrémenté en même temps un indice. Dans la boucle regarder si le caractère actuel est le caractère recherché. Si oui retourner l'indice courant, sinon poursuivre la recherche.

    Tentez d'établir un code de l'algorithme que je viens de vous donnez. Sinon ca va être difficile de vous aidez sans faire l'exercice à votre place (ce qui n'est pas le but, car ca n'améliorera pas votre compréhension du problème).

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    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 : 4 063
    Par défaut
    Citation Envoyé par DevilOS7 Voir le message
    Oui mais je crois qu'on n'a pas encore vu les index.
    Apprendre avec un livre c'est bien, mais faut pas y rester cantonné... Pourquoi ne pas faire une recherche internet et en apprendre plus ?

    J'espère que ton livre te conseille d'utiliser l'interpréteur python pour faire des tests sur quelques lignes de code proposées, sinon tu vas passer à côté de beaucoup d'astuces et risques d'oublier beaucoup de cet apprentissage actuel.

    Pour faire ça, on peut utiliser enumerate, qui même pour un débutant devrait être compréhensible. Si tes exercices ne sont pas évalués, je te conseille cette méthode qui est la bonne ! Dans l'autre cas, on souhaitera sans doute que tu utilises le mot clé range ce qui en soit est simple, si on fait cela correctement, étape par étape.
    1. Calculer la longueur de la chaîne avec len.
    2. Créer une boucle sur cette chaîne en utilisant sa longueur (boucle for conseillée) et range.
    3. Tester pour chaque caractère s[i] si c'est égal au caractère recherché, si oui afficher i.


    mais cette méthode avec range n'est plus trop utilisé, en tout cas, pas par les personnes maîtrisant un minimum le langage.

    Je peux que te conseiller de t'ouvrir à d'autres éléments de cours afin d'y comprendre par tests sur ton interpréteur les différentes manières de parvenir à un résultat.

    Bonne continuation...

  6. #6
    Membre averti Avatar de Oblinky
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 12
    Par défaut
    Citation Envoyé par DevilOS7 Voir le message
    Oui mais je crois qu'on n'a pas encore vu les index.
    C'est une méthode bien pratique qui fonctionne sur les listes, et aussi sur les chaines de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.index(caractere)
    résout ton exercice, mais je ne pense pas que le but est de le faire de cette façon.

    Citation Envoyé par DevilOS7 Voir le message
    Justement j'y ai pensé a extraire chaque caractère pour les mettre dans une liste pour mieux les manipuler, mais rien ne me viens pour la suite.
    Je pense que ce petit exercice est justement fait pour t'habituer à manipuler les chaînes de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chaine = "Roméo & Juliette"
    # On peut extraire un caractère de la chaîne comme pour une liste
    print(chaine[6])
    # On peut aussi itérer sur la chaîne
    for c in chaine :
        print(c)
    Pour ton exercice une boucle while serait en théorie le plus adapté, mais utiliser une boucle for avec un return dedans serait le plus simple (certains n'aiment pas qu'on interrompe les boucles for avec des return mais bon... quand ça raccourci le code je trouve ça mieux perso).

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Apprendre avec un livre c'est bien, mais faut pas y rester cantonné... Pourquoi ne pas faire une recherche internet et en apprendre plus ?

    J'espère que ton livre te conseille d'utiliser l'interpréteur python pour faire des tests sur quelques lignes de code proposées, sinon tu vas passer à côté de beaucoup d'astuces et risques d'oublier beaucoup de cet apprentissage actuel.

    Pour faire ça, on peut utiliser enumerate, qui même pour un débutant devrait être compréhensible. Si tes exercices ne sont pas évalués, je te conseille cette méthode qui est la bonne ! Dans l'autre cas, on souhaitera sans doute que tu utilises le mot clé range ce qui en soit est simple, si on fait cela correctement, étape par étape.
    1. Calculer la longueur de la chaîne avec len.
    2. Créer une boucle sur cette chaîne en utilisant sa longueur (boucle for conseillée) et range.
    3. Tester pour chaque caractère s[i] si c'est égal au caractère recherché, si oui afficher i.


    mais cette méthode avec range n'est plus trop utilisé, en tout cas, pas par les personnes maîtrisant un minimum le langage.

    Je peux que te conseiller de t'ouvrir à d'autres éléments de cours afin d'y comprendre par tests sur ton interpréteur les différentes manières de parvenir à un résultat.

    Bonne continuation...
    Je suis d'accord avec toi, j'aurai pu chercher sur internet et trouver la méthode index, mais la c'est pas le but, le but c'est justement de se creuser un peu, pour développer son sens des résolutions de problèmes.
    Quel est l'avantage de s'entraîner avec l'interpreteur ? Dans le livre ils le font, mais moi je fais tout en fichier.

    Sinon, j'ai trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def trouve(chaine, ca):
        i = 0
        mot = []
        chaine = chaine.lower()
     
        while i < len(chaine):
            mot.append(chaine[i])
            i += 1
     
        for l, y in enumerate(chaine):
            if y == ca:
                print("Il y a un",ca,"a l'indice",l)
    Si vous avez des idées d'améliorations n'hésitez pas !
    Merci pour vos réponses

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    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 : 4 063
    Par défaut
    Citation Envoyé par DevilOS7 Voir le message
    Quel est l'avantage de s'entraîner avec l'interpreteur ? Dans le livre ils le font, mais moi je fais tout en fichier.
    Donc ce livre est bien, mais toi tu ne le fais pas (pas bien !)

    L'interpréteur permet de tester de petites lignes de code rapidement, on visualise rapidement le résultat. Ça assurera que dans l'ensemble de ton code, cette petite partie testée fait bien ce qu'elle doit faire, c'est un incontournable pour tout développeurs python.

    Pour ta solution, une chaîne de caractères est un itérable, ce qui veut dire qu'il n'est aucunement besoin de recréer une liste pour y ajouter ses caractères
    La boucle while est donc inutile.

    Pour la méthode index, si mes souvenirs sont bons, pas le temps de vérifier, on te donne le premier index, ce qui veut dire que si plusieurs caractères identiques se trouvent dans la chaîne, on a que l'index du premier caractère, c'est peut être ce qu'on demande tu me diras ?

    Perso, enumerate fait très bien le travail, et cela simplement !

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    C'est vrai je vais prendre l'habitude.
    Oui, cela marche parfaitement sans la boucle while merci

  10. #10
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    La méthode avec le for in est le plus simple mais la moins performant.

    Index retourne une erreur s'il ne trouve pas la string recherchée.

    Tu devrais employer la méthode find avec sa position de départ et boucler tant que c'est différent >= 0.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    Je viens de découvrir et me documenter sur la méthode find et c'est vrai que c'est mieux surtout pour l'exercice d'amélioration :

    " .Améliorez la fonction de l'exercice précédent en lui ajoutant un troisième paramètre : l'index à partir duquel la
    recherche doit s'effectuer dans la chaîne. Ainsi par exemple, l'instruction :
    print(trouve ("César & Cléopâtre", "r", 5))
    devra afficher : 15 (et non 4 !). "

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    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 : 4 063
    Par défaut
    Les méthodes find et index sont plus efficaces car se sont des bindings C, cependant à ce que j'ai pu en comprendre, le but de l'exercice est de créer la fonction find, et non l'utiliser... On pourrait l'utiliser pour en comprendre l'objectif, mais ça ne sera pas un exercice algorithmique tel que le perçoit l'auteur du livre.

    Je peux me tromper, je n'ai pas lu Swinnen depuis la version 2.5 et j'ai pas le temps de chercher, mais la valeur -1 en cas de caractère non trouvé m'a mis la puce à l'oreille.
    Je ne pense pas que son objectif a changé

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    Voici la solution de l'exercice (mal indenté sur le pdf) :
    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
    def trouve(ch, car, deb=0):
    "trouve l'indice du caractère car dans la chaîne ch"
    i = deb
    while i < len(ch):
    if ch[i] == car:
    return i
    # le caractère est trouvé -> on termine
    i = i + 1
    return -1
    # toute la chaîne a été scannée sans succès
    # Test :
    if __name__ == '__main__':
    print(trouve("Coucou c'est moi", "z"))
    print(trouve("Juliette & Roméo", "&"))
    print(trouve("César & Cléopâtre", "r", 5))
    Pouvez-vous m'expliquer le "return -1" ?

  14. #14
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    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 : 4 063
    Par défaut
    Le -1 est une valeur de retour pour indiquer que le caractère recherché n'a pas été trouvé.

    Lorsque la boucle while est terminée et qu'elle est au dernier index (longueur de la chaîne), il reste plus de caractère à comparer. Sans précision sur la valeur de retour, la valeur sera à None, mais ce n'est pas ce qui est demandé dans ton énoncé, la valeur de retour dans ce cas sera -1.

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    D'accord, merci pour ta réponse

Discussions similaires

  1. Besoin d'aide pour un exercice en assembleur
    Par rayed dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 13/04/2013, 20h03
  2. besoin d'aide pour un exercice (requêtes sql)
    Par stabii dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/01/2011, 00h00
  3. Besoin de piste pour un projet de gestion de planning
    Par PodoLaBrute dans le forum Débuter
    Réponses: 4
    Dernier message: 19/03/2010, 17h53
  4. [Débutant] Besoin d'aide pour un exercice
    Par bebetoalvaro dans le forum Pascal
    Réponses: 9
    Dernier message: 05/02/2007, 01h59
  5. Besoin d'aide pour un exercice sur les registres
    Par zakuza dans le forum Assembleur
    Réponses: 5
    Dernier message: 14/04/2006, 14h23

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