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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 741
    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 741
    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 741
    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 741
    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 741
    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 741
    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 832
    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 832
    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]

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