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 :

Exercice fonction estADN


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Par défaut Exercice fonction estADN
    Bonjour,

    je bloque un peu sur un exercice, je viens donc solliciter votre aide :

    Réalisez une fonction nommée estADN qui vérifie si la chaîne de caractères passée en paramètre ne contient aucun autre caractère que les quatre bases A, C, G et T. Cette fonction retourne la valeur True si tel est le cas, et la valeur False dans le cas contraire. En particulier, elle renvoie True si la chaîne est vide.

    j'ai donc écrit comme fonction :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    def estADN(s):
        """ Fonction qui permet de vérifier si la chaîne de caractère contient les bases "A", "C", "G" et "T" pour être un ADN.
            :param s: (int) chaîne de caractère que l'on souhaite vérifier
            :return: (bool) Renvoie True si la chaîne s est un ADN, sinon false
            
            CU : aucune
            
            Exemple :
            
            >>> estADN("ACGGTAGCTAGTTTCGACTGGAGGGGTA")
            True
            >>> estADN("ACTZATCFDSFSZZG")
            False
            >>> estADN("GCTTYCFZGSGZG")
            False
            >>> estADN("AGCCGPQFQFZFZA")
            False
            >>> estADN("AGTVGSGEGTGA")
            False
            >>> estADN("")
            True
        """
        if (s == ""):
            res = True
        carac = "A" and "G" and "T" and "C"
        for c in s:
            if carac == c in s:
                res = True
            if carac != c in s:
                res = False
        return (res)
     
    if __name__ == '__main__':
        import doctest
        doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS, verbose = True)
    mon problème : la fonction ne fonctionne pas car même si la chaîne en paramètre contient les caractères A C G T, la fonction me renvoie False. J'en déduis donc que le code ne fonctionne pas mais j'ai essayé beaucoup de code sans succès à chaque fois.

    Je me tourne vers vous pour comprendre tout cela et avoir le bon code. Je tiens à préciser que cet exercice m'est demandé dans un contexte de cours en Licence et je dois me limiter à ce que mon prof m'a apprît en cours : Données et expressions, Fonctions, Conditions, Chaînes de caractères.

    Merci d'avance pour votre aide !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Les pépites sont dans ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        carac = "A" and "G" and "T" and "C"
        for c in s:
            if carac == c in s:
                res = True
            if carac != c in s:
                res = False
        return (res)
    Déjà, vous pouvez tester ce que font les lignes carac = "A" and "G" and "T" and "C" et if carac == c in s à la console interactive pour vous assurer que çà fait bien ce que vous en attendez.
    Ensuite vous réfléchissez à votre boucle "for" à sa sortie la valeur de "res" sera le résultat de la condition sur le dernier caractère alors que dès que vous trouver un caractère hors 'ACGT', pas la peine de continuer.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Les pépites sont dans ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        carac = "A" and "G" and "T" and "C"
        for c in s:
            if carac == c in s:
                res = True
            if carac != c in s:
                res = False
        return (res)
    Déjà, vous pouvez tester ce que font les lignes carac = "A" and "G" and "T" and "C" et if carac == c in s à la console interactive pour vous assurer que çà fait bien ce que vous en attendez.
    Ensuite vous réfléchissez à votre boucle "for" à sa sortie la valeur de "res" sera le résultat de la condition sur le dernier caractère alors que dès que vous trouver un caractère hors 'ACGT', pas la peine de continuer.

    - W
    Merci de votre réponse.

    J'ai donc modifié dans un premier temps les lignes pour ACGT, j'ai donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        if (s == ""):
           res = True
        A = "A"
        C = "C"
        T = "T"
        G = "G"
        carac = A, C, T, G
    pour la boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        for c in s:
            if c == carac:
                res = True
            else:
                res = False
    mais ce n'est toujours pas bon pour la boucle for et je ne vois pas pourquoi ce que j'ai écris est faux car je le comprend comme ceci :

    pour les caractères dans la chaîne de caractère s :
    si les caractères sont égales à la variable carac ("A", "C", "T", "G") alors res = True
    sinon:
    res = False


  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Essayez de réfléchir un peu si carac = A, C, T, G comment voulez vous que la condition c == carac ait des chances d'être vraie?
    "c" étant un simple caractère, impossible qu'il puisse être égal au tuple A, C, T, G...
    Si vous savoir si "c" est l'un des "carac", difficile de ne pas écrire une boucle qui comparera chaque caractère de "carac" ou d'utiliser le mot clef "in" qui permet de tester c in carac (qui va faire faire cette boucle par Python).

    Côté boucle "for":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for c in s:
            if c == carac:
                res = True
            else:
                res = False
    "res" vaudra toujours le résultat de la comparaison du dernier caractère.
    Vous ce que vous voulez c'est vérifier que tous les caractères sont dans 'ACGT'...
    Autrement dit, dès qu'on en trouve un de différent, on positionne res et on sort de la boucle avec un "break".

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for c in s:
         if c != c in carac:
             res = False
    else:
          res = True
    Salut,

    Je sais que ce n'est toujours pas bon mais j'en suis là

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par Nadess Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for c in s:
         if c != c in carac:
             res = False
    else:
          res = True
    Salut,

    Je sais que ce n'est toujours pas bon mais j'en suis là
    Essayez de relire ce que vous écrivez que peut bien vouloir dire c != c in carac?
    Vous avez "c in carac" qui retourne un booléen le comparer à un caractère sera toujours faux (et n'importe quoi).
    De plus la console Python vous permet de tester vos idées saugrenues et de constatez que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> 'A' != 'A' in 'ACGT'
    False
    >>> 'Z' != 'Z' in 'ACGT'
    False
    >>>
    donc si çà ne fait pas ce que vous voulez, vous retourner voir dans vos cours, tutos,... là où ils expliquent comment utiliser le mot clef "in".... Et si vous ne savez pas ou chercher, vous pouvez coder çà avec une boucle for, c'est pas très élégant mais çà fonctionne et c'est un bon exercice.

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

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nadess Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if c != c in carac:
    ...
    Bonjour

    Je crois que ce que tu cherches à faire se traduit par if c not in carac. Comme le suggère wiztricks, les tutos ne sont pas fait que pour servir à caler les tables.

    Accessoirement, la variable "res" est inutile. Si c n'est pas dans la liste des caractères autorisés, inutile de regarder les autres puisque de toute façon le résultat sera faux. Te suffit alors de faire un return False à cet endroit. Bon c'est vrai, certains puristes n'aiment pas les return intempestifs mais bon, comme disait ma mère au bridge "un bon coup d'oeil vaut mieux qu'une mauvaise impasse" (et mon prof de karaté disait à peu près la même chose avec sa devise "un point mal acquis vaut mieux que deux 'tu l'auras peut-être honnêtement' ")...
    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]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Puisque vous avez des soucis avec la boucle "for" peut être devriez vous commencer par écrire la fonction est_acgt(ch) qui retourne True si ch est dans 'ACGT'.
    En fait, elle retournera True si ch est égal à un des caractères de 'ACGT', on sort de la boucle dès qu'on a trouvé une égalité. C'est un peu la même mécanique qui doit forcer la sortie de la boucle pour valider vos chaînes d'ADN.

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Je crois que ce que tu cherches à faire se traduit par if c not in carac. Comme le suggère wiztricks, les tutos ne sont pas fait que pour servir à caler les tables.

    Accessoirement, la variable "res" est inutile. Si c n'est pas dans la liste des caractères autorisés, inutile de regarder les autres puisque de toute façon le résultat sera faux. Te suffit alors de faire un return False à cet endroit. Bon c'est vrai, certains puristes n'aiment pas les return intempestifs mais bon, comme disait ma mère au bridge "un bon coup d'oeil vaut mieux qu'une mauvaise impasse" (et mon prof de karaté disait à peu près la même chose avec sa devise "un point mal acquis vaut mieux que deux 'tu l'auras peut-être honnêtement' ")...
    Bonjour,

    Effectivement en faite j'aimerai que ma fonction me renvoie False si il y a un caractère différent de "A", "C", "G", "T" dans la chaîne s, et True s'il n'y a aucun autre caractère que "A", "C", "G", "T".

    Le soucis avec est le suivant :

    Failed example:
    estADN("AGCCGPQFQFZFZA")
    Expected:
    False
    Got:
    True

    Ensuite concernant les res = mon professeur nous oblige à n'utiliser qu'un seul return Bool

  10. #10
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Puisque vous avez des soucis avec la boucle "for" peut être devriez vous commencer par écrire la fonction est_acgt(ch) qui retourne True si ch est dans 'ACGT'.
    En fait, elle retournera True si ch est égal à un des caractères de 'ACGT', on sort de la boucle dès qu'on a trouvé une égalité. C'est un peu la même mécanique qui doit forcer la sortie de la boucle pour valider vos chaînes d'ADN.

    - W
    Bonjour,

    le soucis est que même s'il y a ACGT dans la chaîne ça ne veut pas dire pour autant que c'est un ADN, hors ma fonction doit vérifié qu'il n'y a aucun autre caractère que ACGT pour vérifier si justement notre chaîne est bien un brin d'ADN qui ne peut contenir rien d'autre que les bases A, C, G, T.

    Et c'est tout là mon problème c'est que je n'arrive pas à faire en sorte que la fonction vérifie chaque caractère jusqu'à la fin de la chaîne et dès qu'elle trouve un caractère différent de A, C, G, T renvoie False et si elle ne trouve rien d'autre que des A,C,G,T renvoie True.

    Réalisez une fonction nommée estADN qui vérifie si la chaîne de caractères passée en paramètre ne contient aucun autre caractère que les quatre bases A, C, G et T.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nadess Voir le message
    Bonjour,

    le soucis est que même s'il y a ACGT dans la chaîne ça ne veut pas dire pour autant que c'est un ADN, hors ma fonction doit vérifié qu'il n'y a aucun autre caractère que ACGT pour vérifier si justement notre chaîne est bien un brin d'ADN qui ne peut contenir rien d'autre que les bases A, C, G, T.
    Hé ben ? Suffit de prendre chaque caractère "c" de la chaine et regarder si c not in "ACGT" !!!
    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]

  12. #12
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hé ben ? Suffit de prendre chaque caractère "c" de la chaine et regarder si c not in "ACGT" !!!
    C'est bon, j'ai fini par comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        res = True
        if (s == ""):
            res = True
        A = "A"
        C = "C"
        T = "T"
        G = "G"
        carac = A, C, T, G
        for c in s:
            if c not in carac:
                res = False
        return (res)
    Merci pour votre aide, ainsi que votre patience!

    Cordialement.

  13. #13
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Bonjour,

    Comme l'avait indiqué wiztricks, dès que tu mets res à false, ce n'est plus la peine de parcourir le reste de ta chaîne. A ce moment là, tu peux faire un 'break' pour sortir prématurément de la boucle

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nadess Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        res = True
        if (s == ""):
            res = True


    Citation Envoyé par Nadess Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     A = "A"
        C = "C"
        T = "T"
        G = "G"
    Donner un nom à une variable en fonction de sa valeur, ce n'est pas ce qu'il y a des plus pérenne. Généralement, on utilise plutôt un nom lié à son rôle (nbCar, nbLig, chaineADN, etc). Parce qu'une variable, c'est avant tout quelque chose qui peut varier (d'où le nom). Que se passera-t-il le jour où "A" devient (par exemple) "F" ? Tu écriras alors A="F" ou bien tu supprimeras ta variable A pour la remplacer par une nouvelle variable F quitte à repasser ensuite tout ton code ???

    Citation Envoyé par Nadess Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        carac = A, C, T, G
        for c in s:
            if c not in carac:
    Mouais. Moi j'aurais écrit if c not in "ACGT" mais bon, pourquoi faire simple...?

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def isADN(s):
        for c in s:
            if c not in "ACGT": return False
        return True
    # isADN()

    Et si on veut se la jouer "python à donf": isADN=lambda s: all(c in "ACGT" for c in s)...
    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. Exercice fonction PL/SQl
    Par je viens du sud dans le forum PL/SQL
    Réponses: 2
    Dernier message: 10/08/2016, 12h01
  2. Exercice fonction puissance
    Par patrice rabiller dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 28/08/2012, 13h17
  3. Exercice fonctions haut niveau dans un fichier
    Par Gannox dans le forum Débuter
    Réponses: 3
    Dernier message: 10/03/2012, 17h28
  4. Exercice fonction nombre premier
    Par kreuk801 dans le forum Débuter
    Réponses: 18
    Dernier message: 10/02/2011, 15h02
  5. Exercice sur les fonctions
    Par jeje-2309 dans le forum Mathématiques
    Réponses: 7
    Dernier message: 01/10/2007, 12h04

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