Instruction goto en python — Les-mathematiques.net The most powerful custom community solution in the world

Instruction goto en python

Comment faire pour revenir à un point précis d'un programme en python.
J'ai essayé avec goto sans succès.
«1

Réponses

  • Bonsoir,
    Il existe des modules goto à installer mais cela fait déjà bien longtemps que les goto sont passés de mode et que plus personne ne s'en sert !
  • On peut toujours (et on doit !!!) se passer des instructions GOTO.

    Voir la programmation spaghetti.

    Dans quel context veux-tu faire ça ? On peut t'aider.
  • Bonjour.

    Plutôt, avec les méthodes de programmation actuelles, il est toujours possible de se passer de cette instruction.

    Si vraiment un saut doit être réalisé entre deux parties de programme de cette manière, c'est que le programmeur n'a pas assez analysé les flux de son programme.

    A bientôt.

    Cherche livres et objets du domaine mathématique :

    Intégraphes, règles log et calculateurs électromécaniques.

  • je fais une boucle while moyennnant une certaine condition
    tant que celle ci n'est pas vraie je souhaite revenir au début du programme
  • Héhéhé écrivait :
    > On peut toujours (et on doit !!!) se passer des instructions GOTO.

    En Python je ne sais pas, mais dans d'autres langages, notamment C, l'utilisation de goto peut être très utile et éviter la duplication de code tout en restant optimal. Ainsi la traduction par le couple flex et bison d'un interpréteur en C contient pas mal de goto. Ça peut aussi rendre le code plus lisible (en évitant un else dans un if, au même titre qu'un return dans une fonction).
  • Merci, parisse.
    J’ai beau ne pas être un spécialiste de la programmation, j’ai du mal avec ce genre de diktat (contre le goto, contre le return au milieu d’une fonction, etc.)
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Le GOTO ??? Berrrkkkkk. C'est pire que plus personne s'en sert, la plupart des analyseurs de codes rejettent le GOTO en le considérant comme une erreur (non critique certes).
  • Un descriptif du besoin serait le bienvenu pour comprendre ce qui est voulu et trouver un meilleur algorithme.

    Sinon rappelons qu'il est possible de sortir d'une boucle avec "break"
  • OK pour vos commentaires mais je n'ai pas la réponse
  • Oui, j’ai aussi vu des diktats contre le break.
    Je préfère un goto bien placé plutôt qu’un contournement mal foutu (mais bon, je ne code pas en C).

    L’instruction goto n’existe pas en Python, du moins, il n’y a pas de mot réservé qui porte ce nom ou qui joue ce rôle. Le créateur du langage a jugé que c’était inutile.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • J’ai déjà entendu cette guerre contre les GOTO.
    Un programmeur m’avait dit qu’en général on s’en passe mais que parfois on les préfère à d’autres solutions.
    C’était dans un bar, de manière très informelle.
  • Si l'instruction utile est en début de programme, à priori il serait préférable d'utiliser une instruction repeat reprenant le début du code avec retour au début à l'arrivée de la condition (qui arrive à la fin pour ce jeu d'instructions). Edit : inapproprié en Python, plutôt une instruction try ? L'idée étant de conditionner le jeu d'instructions précédentes à la condition au préalable, ce que je ne vois pas fait facilement à brûle-pourpoint.

    Sans en savoir plus sur le programme en lui-même, il est difficile de conseiller une solution.

    Sinon, pour rappel, c'est Knuth Edit : Dijkstra qui a tué le Goto, dans son célèbre article sur le sujet (dont je recommande la lecture très instructive, voir le fichier joint).

    Et on est bien d'accord que quand on descend dans des instructions de bas niveau, il y a toutes sortes de jump qui débarquent, mais dans des langages de haut niveau (type Python), l'accent est plus apporté à la structuration algorithmique, ce qui n'est pas un mal en soi.

    A bientôt.

    Cherche livres et objets du domaine mathématique :

    Intégraphes, règles log et calculateurs électromécaniques.

  • Bonjour ,
    Une autre piste mais qui nécessite tkinter (bibliothèque graphique)
    Cordialement
    """   Répétition d'une fonction  sous tkinter ---------------------------------
    --            
    --               Utilisation de la méthode after de la classe window
    --
    ----------------------------------------------------------------------------"""
    
    from tkinter import *  #-- application graphique (canevas , boutons , label)
    
    #=========  Fenêtre principale =======================================================
        
    fen = Tk()   #--  Mise en place de la fenetre 
    fen.title("Essai")
    cnv = Canvas(fen, width=150, height= 80, bg="aliceblue")
    cnv.grid(row=0, column=0)
    #------------------------------------------------------------------------------
    def Mon_Programme ():
        
        #-- instructions du programme
        
        print("Reprise du programme , cliquer sur le bouton Quitter pour arrêter")
        
        N=10
        while N > 0:
            N = N - 1
            print("N : " , N)
            
            #-- autres instructions
            
        #-- à la sortie de la boucle while , on reprend la fonction Mon_Programme  
        fen.after(1000 , Mon_Programme) #-- 1000 est le délai en ms avant la
                                      #--   reprise de Mon_Programme
             
        
    #==========  Boutons de base  =================================================
    
    #-- bouton pour quiter  -------
    btn_quit = Button(fen , text=" Quitter " ,font=("Helvetica", 18),
                      command= fen.destroy)
    
    cnv.create_window(60, 30, window=btn_quit)
    
    
    #===============================================================================
    
    Mon_Programme()
    
    fen.mainloop()
    
    
    
    
    
    
    
    
  • J'ai essayé avec goto sans succès.

    Tu ne devrais pas... python c'est un langage structuré le goto va à l'encontre de la structuration du code c'est utile parfois ou nécessaire...en assembleur!
    Comment faire pour revenir à un point précis d'un programme en python.
    while True:
        [color=#3366CC]"""mettre le code ici!!"""[/color]
        
        if [color=#3366CC]"""mettre une condition ici!!"""[/color]:
            continue
        else
            break
    

    Tant que la condition est vraie le code sera de nouveau exécuté.
    je fais une boucle while moyennnant une certaine condition
    tant que celle ci n'est pas vraie je souhaite revenir au début du programme

    C'est une boucle repeat mais ça n'existe pas en python (en C c'est possible do...while) il faut utiliser le code ci-dessus.
  • Le repeat... until de Python, c'est ça :
    while True:
        # du code ici
    
        if condition:
            break
    
  • C'est pas clair pour moi
  • @stephane_idf : La réponse est simple : restructure ton code pour ne pas utiliser goto.
    Si tu tiens à utiliser goto, tu peux aller voir ici : http://entrian.com/goto/
  • J’ai écrit un paquet de lignes de code en Python, je n’ai jamais eu besoin de goto.
    Je ne vais pas écrire en revanche qu’en C, il ne faut jamais l’utiliser (je ne code pas en C) et je me vois mal donner des leçons à un codeur en C.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • C'est pas clair pour moi

    C'est certain.
    Le goto n'est utilisé que dans des langages où il faut dire au processeur ce qu'il doit faire comme l'assembleur.
    Il est resté dans des langages comme le C.

    Mais pour des langages interprétés comme python il ne faut même pas y penser.

    Bref tu fais ça :
    while True:
        """ton code ici"""
    
        if condition:
            break
    
  • Bonjour

    Qui l'eût cru ? Vous m'avez convaincu. J'ai connu les "goto" du langage BASIC, et ils me filent des boutons. C'est souvent un signe de mauvaise conception (dans le cycle "cahier des charges, spécifications, conception, implémentation"). Je ne crois pas qu'il faille encourager les programmeurs dans ce sens. Mais c'est vrai qu'après avoir lu les exemples du lien de Philippe Malot, je reconnais que dans un contexte de liste de tâches à accomplir, se passer des "goto" demanderait 2 choses :
    • Faire une boucle avec une variable dont le sens serait trop vague. BoucleFinie==False ?
    • Sauter les instructions de la boucle qu'il ne faut plus faire pour ce tour-ci.
    2 choses simplifiées par la présence de goto.
  • Je pense que l'allergie au goto, c'est un truc de vieux (comme moi, hein) qui en ont connu les excès à l'époque du basic (années 80).
    Au fond, un break, un return n'est qu'un goto un peu déguisé. Dans certains cas, c'est se l'interdire qui conduit à un code obscur.
  • Si les fonctions et boucles ne font pas 10 km de long, le break et le return ont un comportement plus « local » qu'un GOTO qui peut t'emmener de n'importe quel endroit du programme à n'importe quel endroit du programme — comme en BASIC. Ce dernier cas rend l'analyse du code difficile.

    Évidemment, dans certaines conditions d'utilisation localisée, GOTO peut faire le job correctement. Respecter les doses prescrites. ;-)
  • Même si on tolère des goto dans les algorithmes , le codage en python de base (sans librairie spécifique) ne contiendra pas de goto mais des break comme présenté par soleil_vert par exemple .
  • brian a écrit:
    Si les fonctions et boucles ne font pas 10 km de long, le break et le return ont un comportement plus « local » qu'un GOTO qui peut t'emmener de n'importe quel endroit du programme à n'importe quel endroit du programme
    Très bonne remarque. En fait, moi non plus, je n'utilise jamais goto.
    Mais je me souviens de mes années Pascal où je suis souvent tombé dans l'excès inverse...
  • Stephane_Idf
    Ecris ici un code avec un GOTO, un code d'une dizaine de lignes à peu près, je pense que ça devrait largement suffire à décrire ce que tu veux faire.
    Dans les 2 heures qui suivront, tu auras un code Python propre qui fait ce que tu veux faire. Et sans GOTO bien sûr.

    PS : Je programme dans un langage autre. Je viens de vérifier et je vois que l'instruction GOTO existe dans ce langage. Mais je suis sûr d'une chose : Sur 500 000 ou 1 000 000 de lignes de code que j'ai pu écrire avec ce langage, je n'ai jamais utilisé le GOTO.
  • Moi non plus je n'ai jamais utilisé de goto que je remplaçais par son équivalent (mais structuré) répéter ... jusqu'à <condition>
    Mais en python , même cet équivalent n'existe pas . Il ne reste que ce qu'a proposé soleil_vert pour faire simple et structuré .
  • Bonjour,

    En python, tant que <condition> ... fonctionne très bien, il suffit d'initialiser la condition.

    Cordialement,

    Rescassol
  • On n’est pas obligé, en tant que matheux, de répéter ce qu’a écrit Dijkstra il y a un demi siècle (tout en voulant bannir l’utilisation de goto même en assembleur voire en langage machine).
    Y a-t-il parmi nous un programmeur professionnel ? Si oui, qu’en pense-t-il ? À mon avis, il est pragmatique : si un goto bien placé évite un code abscons, il utilise goto si l’instruction est disponible.
    Je pense que Dijkstra réagissait à un abus de goto qui rendait le code aussi illisible que son interdiction sèche quand il est disponible.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Rescassol,

    Corrige-moi si je me trompe.
    (j’appelle n=1 la ligne 1, n=2 la ligne 2, n=300 la ligne 3, etc.)
    n:=0
    tant que n<100
    n:=1
    n:=2
    n:=300
    n:=4
    n:=5
    fin tant que
    

    Ce code réalise une boucle infinie, non ?
    Jadis, je pensais qu’à l’exécution de la ligne 3, la machine sortait du $tant \ que$.
    J’avais déjà posé la question et on m’avait rétorqué un « bah qu’est-ce que tu crois ? non, tout le scripte est parcouru puis a la ligne 5, le test avec n est renouvelé. »
    A l’époque je pensais que le test avec n avait lieu après chaque instruction.

    Qu’en est-il aujourd’hui ?
    Je n’ai pas la possibilité de tester, ma dextérité sur mon téléphone n’est pas propice à cela.

    Suis-je dans l'erreur ?

    Cordialement

    Dom
  • la réponse est sûrement ...

    Je remarque qu'arrivé à ce 31ième post, je n'ai toujours pas réellement compris le besoin :-S
  • Très novice, je ne peux pas répondre, Paul.

    Mais, dans mon code, si je souhaite sortir à « n:=300 » pour ne pas exécuter les deux instructions qui suivent, que faire ?
  • Hello,

    Comme j'ai vu qu'il y avait des vieux (en français dans le texte), je me permets une petite intrusion, cf le point 2.

    1. Je commence par Lourran (qui lui doit être un petit jeune).

    Sur un ton polémique. Je ne connais pas Python et j'en profite pour poser une question : écrire un code Python propre, c'est possible ? Ce que j'en ai vu ici sur ce noble forum ne m'a jamais inspiré. Indentation comme structure de contrôle, cela me paraît dingue. Je pourrais te raconter une anecdote concernant Axiom (un système de Calcul Formel d'IBM qui a été abandonné, tu es trop jeune pour en avoir entendu parler) qui avait choisi l'indentation comme structure de contrôle. Concernant cette anectode, c'est tellement énorme que je ne sais pas si tu me croirais (je n'ai plus de trace écrite).

    Peut-on faire propre avec un langage qui choisit le nom ``len'' (pour Length) comme ``built-in function'' ?

    Note : on pourrait me rétorquer que, ne connaissant pas Python, j'ai qu'à fermer ma gueule. C'est pas faux. Mais il m'a semblé que parfois, sur ce forum et ailleurs, il y a des personnes qui ne connaissaient rien à XXX, mais cela ne les gênait pas pour en parler (je me trompe ?).

    Autre chose sous forme de question indiscrète : j'ai vu le nombre de lignes (de programmation) que tu mentionnes. C'était (ou c'est encore) ton métier ? De mon côté, ce n'était pas le mien et tu vois ci-dessous, que je suis un petit joueur. Note : maple, c'est contraint-forcé dans le cadre de l'enseignement.
    [color=#000000]knecht> find . -name "*.magma" | wc
       5732    5732  304015
    knecht> find . -name "*.maple" | wc
        425     425   19781
    [/color]
    

    2. Pour les vieilles et les vieux.

    A. L'extrait ci-dessous est célèbre. Pourriez vous deviner de qui il s'agit ? Un indice : la référence [17], c'est ``Structured Programming'' (1972) de Dahl, Dijkstra, Hoare. Quant à la référence [55], je ne la donne pas car cela serait trop facile.

    B. Quelle est l'origine (cela n'est pas une colle car j'aimerais bien le savoir) de ``Les vrais programmeurs n'utilisent pas Pascal'', voir par exemple http://ftls.org/fr/gratuit/divertir/rire/coder.shtml

    C. Je suppose que vous connaissez le texte ``The Humble Programmer'' (Oct. 1972) de Dijkstra. Peut-on en trouver une traduction en français (je suis trop nul en anglais pour apprécier) ?115540
  • Salut Claude,

    Donald Knuth Décembre 1974
  • @Dom

    En POO, on peut obtenir un fonctionnement proche de ce que tu veux.

    n ne doit pas être un entier, mais une classe avec certaines propriétés : la valeur à afficher, plus des flags divers.
    N est un test_dom
    N.bModifiable=Vrai
    N.VMax = 100
    N.V0=3
    
    TANTQUE N.V0 <= 100 
    	N.V0 = 4 ; 	Trace(N.V0)
    	N.V0 = 5 ; 	Trace(N.V0)
    	N.V0 = 300 ;    Trace(N.V0)
    	N.V0 = 6 ; 	Trace(N.V0)
    	N.V0 = 7 ; 	Trace(N.V0)
    FIN
    
    Résultat de l'affichage :
    4
    5
    300
    300
    300
    

    Et pour obtenir ça , dans la création de la classe Test_Dom, on met :
    // Réccupération de la propriété V0
    PROCEDURE PUBLIQUE V0() : entier
    
    RENVOYER V0
    
    // Affectation de la propriété V0
    PROCEDURE PUBLIQUE V0(Valeur est un entier)
    SI bModifiable = Faux ALORS RETOUR
    SI Valeur > VMax ALORS
    	bModifiable = Faux 
    FIN
    V0=Valeur
    

    Ici, je fais un truc batard, intermédiaire entre de la POO et de la programmation 'procédurale'. Un programmeur soigneux fera ce qu'il faut pour que l'affichage s'arrête après la 3ème ligne.
  • @Rescassol ,
    en programmation structurée simple , si on veut quitter la boucle de répétition dès qu'un valeur dépasse une limite max donnée , on peut écrire :
    n = v0 
    si n < max  quitter = oui
    sinon  quitter = non
    tant que quitter == non
         n = v1
         si n < max 
               n = v2
               si n < max 
                       n = v3
                       si n < max 
                               n = v4
                               si n < max 
                                       n = v5
                                       si n < max 
                                             n = v2
                                             si n >= max  quitter = oui
                                        sinon quitter = oui
                                sinon quitter = oui
                         sinon quitter = oui
                sinon quitter = oui
         sinon quitter = oui
    fin tant que
    


    C'est un peu long mais ça marche et c'est clair (structuré)
    Cordialement
  • @Claude
    Axiom d'IBM , effectivement, ça ne me dit rien.
    De là à conclure que je suis un petit jeune, faudrait pas exagérer.

    Programmer, c'est mon métier ? J'ai toujours plus ou moins touché à la programmation, mais je ne me suis jamais considéré comme programmeur ni informaticien. La programmation n'est qu'un moyen pour faire mon métier de '<<chercheur>>' avec des énormes guillemets.

    Python : je ne suis pas du tout un spécialiste. Je saurais écrire un truc sur 10 lignes ... mais ça s'arrête là.

    Sur ces questions de comparaison de langages de programmation, j'ai ma philosophie : Le langage qui est le mieux pour toi, c'est le langage que tu maitrises et que tu aimes.
    Autrement dit : les goûts et les couleurs, c'est subjectif. Certains préfèrent Mozart à Picasso, d'autres préfèrent Python à PHP. Chacun est libre de faire ses choix.

    Sur l'histoire d'indentation, je me souviens de Fortran.. c'était un langage où il fallait respecter l'indentation, et il fallait en plus des END (ou je ne sais quel mot clé) pour marquer la fin d'un bloc : ceinture et bretelles.

    L'histoire de l'indentation, j'aime vraiment bien en fait.
    Quand je programme, même si l'indentation n'est pas imposée par le langage, je vais respecter l'indentation, pour un confort de lecture. Un programme avec une indentation 'aléatoire' est illisible.
    Et ça me plait bien quand le compilateur a les mêmes critères que moi (l'interpréteur en l'occurrence si on parle de Python).
  • Sans indentation , les 20 lignes d'algorithme que je viens de donner seraient illisibles .
  • L’indentation à la Python a plusieurs avantages :
    • La structure des blocs est immédiatement lisible.
    • On gratte une paire de caractères (les accolades) pour autre chose (les ensembles et les dictionnaires).
    Ça a pour inconvénient :
    • Gare au mélange de tabulations et d’espaces.
    • Ça devient aussi illisible que n’importe quel autre langage si le bloc est trop long.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Gai-Requin

    Oui, c'est bien Donald Knuth lui-même répondant en partie à Dijkstra dans un papier de 40 pages ``Structured Programming with go to Statements''. Mais tu as triché car tu n'es pas vieux et tu as utilisé le web. Trop facile.

    Et les mangeurs de quiche ? http://www.usm.uni-muenchen.de/~hoffmann/roff/tmp/rpdup.pdf

    Lourran.

    Bien sûr que l'indentation est importante. Mais l'indentation comme structure de contrôle c'est autre chose. Axiom IBM : le système de Calcul Formel le plus puissant que j'ai connu. Et le plus mal réalisé qui soit. Il en est mort.

    C'est avec ce langage que j'ai appris à l'époque certaines méthodes de Calcul Formel en lisant du code (le code était ouvert). Je suis pas fier de le dire mais c'est en lisant du code j'ai appris (la première fois) comment on calculait le genre d'une courbe !

    L'anecdote en question concerne le calcul du déterminant d'une matrice $M \in M_n(A)$ dans une seule fonction qui s'étendait sur 4-5 pages. Il y avait des tests pour détecter la méthode à utiliser selon le type d'anneau $A$ : un corps, un anneau intègre, un anneau intègre avec test de divisibilité, un anneau quelconque ...etc.. (je ne me souviens plus très bien). Quelque chose de très sophistiqué (les gens qui travaillaient dans le centre de recherches qui développait Axiom n'étaient pas des charlots). Sauf qu'il y avait un défaut d'indentation qui avait comme conséquence que l'on ne passait jamais dans une branche (la branche dans laquelle était utilisé l'algorithme de Bareiss). Véridique.

    Un détail important dans le post de Dom ``Je n’ai pas la possibilité de tester ....''. Que faut-il en penser ? Pour connaitre la sémantique (d'un langage de programmation), il faut réaliser des tests ? En 2021 ?
  • @Dom: break. L'instruction "break" sort de la boucle prématurément.
    Pour la vision du test à chaque ligne, l'informatique n'a jamais marché comme cela.
    Enfin, si tu as un objet dont tu veux contrôler la valeur en permanence, tu pourras faire de la programmation évènementielle. Et l'affectation de 300 à "n" va provoquer un évènement dont le traitement exécutera du code.
  • @PetitLutinMalicieux
    "Pour la vision du test à chaque ligne, l'informatique n'a jamais marché comme cela."
    Et pourtant ça marche mais peut-être que c'est trop simple , pas assez sophistiqué .
    S'il y a d'autres instructions autour du test , c'est facile de mettre l'ensemble dans une fonction qui retourne le résultat du test .
    Cordialement
  • @fm_31: c'est beaucoup moins clair que d'utiliser break ou return, car on a des if imbriques (je vous laisse imaginer l'indentation au bout d'une bonne dizaine de tests).
    break dans une boucle de meme que return en cours de fonction est effectivement une forme de goto qui a l'avantage de rendre le code beaucoup plus lisible que d'utiliser une variable booleenne artificielle dans une boucle ou/et de faire des tests imbriques.
    Je n'utilise pas goto moi-meme, uniquement break et return, par contre, j'ai vu du code source industriel ou goto est utilise (en plus du code emis par flex et bison).
  • On peut mettre des points virgules en python, quand on a pas envie de faire un fichier et qu'on teste un truc fissa sur une ligne.
    Axiom existe encore en fork https://fricas.github.io/, sinon il a été totalement libéré.

    Ça me rappelle Multics, y'a plus d'jeunesse ;-)

    Très mauvais souvenir de goto aussi avec les programmes TO7 qu'on finissait par ne plus comprendre. Quand j'ai appris Fortran 77 en 1ere année d'école j'ai cru que j'étais au paradis. Et quand on connaît la tronche qui l'a conçu ce n'était pas qu'une impression.
  • Bonsoir.
    En ce qui me concerne, j'affectionne tout particulièrement le Goto, et n'ai pas vraiment pris l'habitude d'indenter le peu de code que je fais (qui est d'une inutilité crasse, par dessus le marché).
    Autant dire que je me sens bien dépassé par rapport à vous.

    Pour la petite anecdote, j'ai placé l'article de Dijkstra dans mon précédent post, je ne sais pas si quelqu'un l'a un jour traduit en Français mais cela me semble bien inutile, tant il est bien écrit.
    À bientôt.

    Cherche livres et objets du domaine mathématique :

    Intégraphes, règles log et calculateurs électromécaniques.

  • Et y'avait pas que les goto, il y avait aussi gosub !

    https://fr.m.wiktionary.org/wiki/y’a
  • Ah, mais GOSUB, ça permettait de programmer avec des fonctions ! Un sacré progrès. ;-)

    (dont je n'ai pas vraiment profité : trop jeune et aucune documentation à ma portée — pas d'accès Internet à l'époque...)
  • Aucune documentation ? Et les listings d'Hebdogiciel, c'est quoi alors ? (:P)
  • Les uniques fois où j'ai utilisé le GOTO et le GOSUB c'était sur ma première et unique calculatrice programmable en BASIC

    https://collection.onceuponabyte.org/Pictures/pocketcomp/Poc0024a.JPG
  • Bonjour,

    Raoul, j'ai encore plus vieux que ça, la PC 1211.

    Cordialement,

    Rescassol
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!