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 :

[Debutant] Erreurs de syntaxe dans une fonction


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut [Debutant] Erreurs de syntaxe dans une fonction
    Bonjour à tous

    Je débute sur python, et je dois faire un script de codage/décodage sur le code Cesar.

    à la compilation ; Geany me détecte une erreur de syntaxe sur la ligne "return" des 2 dernières fonctions (ligne 26 , puis 30 ) , alors que les 2 premières marchent correctement. J'ai cherché mais je sèche, alors que je suis sur que c'est 3 fois rien
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    def decale (car,clef ): # Decale chaque caractère de la valeur de la clef
    	cod0 = ord(car) # Traduction du caractère en ASCII
    	# Traitement des lettres minuscules
    	if (cod0 >= 97 and cod0 <= 122 ) :
    		cod1 = ((cod0-97)+clef)%26 + 97
    	# Traitement des lettres majuscules 
    	elif (cod0 >= 65 and cod0 <= 90 ) :
    		cod1 = ((cod0-65)+clef)%26 + 65
    	else : 
    		cod1 = cod0  # Traitement des symboles autres que des lettres : pas de changement
    	carCode = chr(cod1) # Récupération du caractère codé
     
    	return carCode 
     
    def code_decode ( mess, clef ) : # Encode ou décode le message entier connaissant la clé
    	messclair =""
    	for i in range (0,len(mess)) :
    		messclair = messclair + decale (mess[i],clef)
    	return messclair
     
    def Initialisation_Clef ():
    	clef = -1
    	while not (clef >=0 and clef <= 26 ) :
    		clef = int (input ("Entrer la clé de cryptage (enre 1 et 26) ou 0 si elle est inconnue \n")
    	return clef
     
    def Initialisation_Tache ():		
    	tache = int (input ("Taper 1 pour coder un message et 2 pour décoder \n")
    	return tache
     
    continuer = True
    while continuer :
     
     
     
    	mess = input ("Entrer le message  \n")
    	a= decode ( mess ,3)
    	print (a)
    	arret = input ("Appuyer sur x pour arreter \n")
     
     
    	if (arret == "x" ) :
    		continuer = False
    Je suis aussi preneur de tout conseil pour améliorer le code (notamment la condition de sortie du script que je trouve peu élégante, mais je me suis pas encore penché la dessus)

    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Désolé du dérangement , je viens en relisant une énième fois de trouver , c'était une parenthèse non fermée à la ligne d'avant

  3. #3
    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
    Citation Envoyé par balix Voir le message
    Je suis aussi preneur de tout conseil pour améliorer le code (notamment la condition de sortie du script que je trouve peu élégante, mais je me suis pas encore penché la dessus)

    Merci
    Salut,

    ce qui me paraît le plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while 1:
        mess = input ("Entrer le message ou 'x' pour quitter:  \n")
        if mess in ("x", "X"):
            break
        a = decode(mess, 3)
        print(a)

  4. #4
    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,

    Je suis aussi preneur de tout conseil pour améliorer le code (notamment la condition de sortie du script que je trouve peu élégante, mais je me suis pas encore penché la dessus)
    Je n'aime pas l'écriture de la fonction decale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def decale (car,clef ): # Decale chaque caractère de la valeur de la clef
        cod0 = ord(car) # Traduction du caractère en ASCII
        # Traitement des lettres minuscules
        if (cod0 >= 97 and cod0 <= 122 ) :
            cod1 = ((cod0-97)+clef)%26 + 97
        # Traitement des lettres majuscules 
        elif (cod0 >= 65 and cod0 <= 90 ) :
            cod1 = ((cod0-65)+clef)%26 + 65
        else : 
            cod1 = cod0  # Traitement des symboles autres que des lettres : pas de changement
        carCode = chr(cod1) # Récupération du caractère codé
     
        return carCode
    Si le code est si difficile à comprendre au point de se sentir obligé de mettre plein de commentaires, c'est qu'il est limite toxique. Le premier agent toxique est d'utiliser des nombres en dur plutôt que d'essayer d'en comprendre l'usage et arriver a leur donner un nom. Si la machine peut se permettre de travailler avec du binaire, nous non!
    Pourquoi avoir inventé autant de langages si l'important n'était pas dans les symboles!

    Regardez 97 et 65, la variable char pouvant être majuscule ou minuscule, lui appliquer "+clef" et retomber "dans" majuscule ou minuscule passe par un offset. En Python, çà pourrait s'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def decale (car,clef ): # Decale chaque caractère de la valeur de la clef
        cod0 = ord(car)       # Traduction du caractère en ASCII
        if 'a' <= car <= 'z':
            offset = ord('a')
            cod1 = ((cod0-offset)+clef)%26 + offset
        elif 'A' <= car <= 'Z':
            offset = ord('A')
            cod1 = ((cod0-offset)+clef)%26 + offset
        else : 
            cod1 = cod0  # Traitement des symboles autres que des lettres : pas de changement
        carCode = chr(cod1) # Récupération du caractère codé
     
        return carCode
    Plus la peine de mettre en commentaire "ici c'est pour les minuscules" et "là pour les majuscules"!

    La ligne "cod1 = ((cod0-offset)+clef)%26 + offset" se répète car devenue fonction d'offset.
    On pourrait donc séparer calcul de l'offset et celui du caractère à retourner:

    Ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def decale (car,clef ): 
     
        if 'a' <= car <= 'z':
            offset = ord('a')
        elif 'A' <= car <= 'Z':
            offset = ord('A')
        else: 
            return car
     
        cod1 = ((ord(car)-offset)+clef)%26 + offset
        return chr(cod1)
    On a quand même pas mal élagué la mauvaise herbe...
    Est-ce que commenter ces lignes est encore indispensable?

    On peut pousser dans le code "auto-commenté" en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import string
     
    def shift_char(ch, count):
        for letters in (string.ascii_lowercase, string.ascii_uppercase):
            if ch in letters:
                ix = (letters.index(ch) + count) % len(letters)
                ch = letters[ix]
                break
        return ch
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup à tous les 2.

    J'étudie ça de près. Y'a plusieurs instructions que je connais pas dans ce que vous m'avez répondu, ça va me permettre d'étudier ça, c'est exactement le genre réponse que j'attendais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de syntaxe dans une fonction, uniquement sur PhpMyAdmin
    Par Cyanatide dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 29/05/2012, 13h13
  2. Erreur d'argument dans une fonction
    Par rouliane dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/12/2006, 11h52
  3. [SQL] erreur de syntaxe dans une requete
    Par einsteineuzzz dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 15/06/2006, 09h24
  4. [8i][PL/SQL] erreur avec lpad dans une fonction
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 16/03/2006, 06h22
  5. Erreur de syntaxe dans une requete
    Par linou dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/08/2005, 12h44

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