Partage
  • Partager sur Facebook
  • Partager sur Twitter

Quelle est la difference entre if et elif ?

Sujet résolu
    28 juillet 2021 à 21:02:10

    Bonjour, comme écrit sur le titre, je ne sais pas concrètement la différence
    On pourra simplement mettre des if ?
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      28 juillet 2021 à 21:15:20

      Tu ne peux mettre elif que si tu as déjà un if. elif veut dire sinon si. Après, on ne peut pas mettre des if à la place de elif, c'est expliqué en détail ici, voici les deux exemples :

      m = 1
      print(m)
      
      if m == 1:
          print("Or")
      elif m == 2:
          print("Argent")
      elif m == 3:
          print("Bronze")
      
      print("bonjour !")

      à confronter à 

      m = 1
      print(m)
      
      if m==1:
          print("Or")
      if m==2:
          print("Argent")
      if m==3:
          print("Bronze")
      
      print("bonjour!")




      -
      Edité par PascalOrtiz 28 juillet 2021 à 21:17:30

      • Partager sur Facebook
      • Partager sur Twitter
        29 juillet 2021 à 12:11:30

        Salut!

          Je vais apporter quelques éléments de réponse a votre question.

          En réalité elif n'est qu'un complémentaire de if. Il n'est pas possible d'utiliser elif sans if. Lorsque vous voulez tester plusieurs valeurs, il est toutefois possible d'utiliser une succession de if , exemple:

        def http_error(status):
            if status == 400:
                return "Bad request"
            if status == 404:
                return "Not found"
            if status == 418:
                return "I'm a teapot"


        où bien faire recours au if ... elif..  qui marche également,  exemple:

        def http_error(status):
            if status == 400:
                return "Bad request"
            elif status == 404:
                return "Not found"
            elif status == 418:
                return "I'm a teapot"
        Avec la version 3.10 qui est en attente, nous pourront utiliser la syntaxe switch ... case..
        def http_error(status):
            match status:
                case 400:
                    return "Bad request"
                case 404:
                    return "Not found"
                case 418:
        
        return"I'm a teapot" 
        c'est possible de simuler les switch .. case avec les versions antérieurs de python en utilisant les référence aux fonctions  

         j'espère que vous saurez en faire bon usage 

        • Partager sur Facebook
        • Partager sur Twitter
          29 juillet 2021 à 12:30:21

          Na, elif évite l'imbrication de else :/if.
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            29 juillet 2021 à 13:12:57

            Nguemetajoel a écrit:

              Lorsque vous voulez tester plusieurs valeurs, il est toutefois possible d'utiliser une succession de if , exemple:

            def http_error(status):
                if status == 400:
                    return "Bad request"
                if status == 404:
                    return "Not found"
                if status == 418:
                    return "I'm a teapot"

            Il faut quand même préciser que cela ne marche que dans une situation très particulière où on a un return (ou un break). On peut aussi signaler que dans un cas comme ci-dessus, il arrive qu'un tel switch soit remplacé par un dictionnaire.

            En outre ici, c'est un cas typique où on aurait pu utiliser une expression conditionnelle (certes, emboîtée).

            Nguemetajoel a écrit:

            Avec la version 3.10 qui est en attente, nous pourront utiliser la syntaxe switch ... case..

            Bonne remarque ! Et le switch sera sans fall through.


            josmiley a écrit:

            Na, elif évite l'imbrication de else :/if.

            Tout à fait, si on n'a pas de elif, on peut se retrouver avec indentation très profonde.


            • Partager sur Facebook
            • Partager sur Twitter
              29 juillet 2021 à 13:49:27

              Le "problème" du switch sous forme de dictionnaire, c'est que le dictionnaire est entièrement évalué.
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                29 juillet 2021 à 14:16:57

                josmiley a écrit:

                Le "problème" du switch sous forme de dictionnaire, c'est que le dictionnaire est entièrement évalué.


                Effectivement, mais si l'appel au switch est fréquent, on peut essayer de se débrouiller pour que le dictionnaire soit évalué une bonne fois pour toutes. Un gros switch et répété souvent peut avoir un certain coût.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 juillet 2021 à 15:28:21

                  Et c'est pour quand Python 3.10?
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    29 juillet 2021 à 15:40:31

                    PierrotLeFou a écrit:

                    Et c'est pour quand Python 3.10?


                    Début octobre d'après ce document
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 juillet 2021 à 15:48:58

                      La 1ère Release Candidate de python 3.10 est prévue pour le 2 aout 2021 https://pythoninsider.blogspot.com/2021/07/python-3100b4-is-available.html
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 juillet 2021 à 17:09:29

                        Bonjour,

                        En fait dans d'autres langages, on écrit:

                        if(....)

                        else if (......)

                        elif n'est qu'une contraction de else if

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 juillet 2021 à 18:19:16

                          Phil_1857 a écrit:

                          Bonjour,

                          En fait dans d'autres langages, on écrit:

                          if(....)

                          else if (......)

                          elif n'est qu'une contraction de else if


                          Oui, tu as raison de le signaler, elif = else + if, ça aide à comprendre. elif existe depuis longtemps puisque le préprocesseur C l'utilise ainsi que Bash et Ruby. Php utilise elseif et Perl elsif, j'ai rien trouvé d'autre.

                          Il y a quand même une différence, c'est qu'en Python il y a une vraie instruction elif tandis qu'en C, javascript, etc, ce sont juste deux instructions utilisées ensemble.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 juillet 2021 à 18:56:41

                            Pour les différences, on peut reprendre le code de PascalOrtiz et le modifier ainsi:

                            m = 1
                            print(m)
                             
                            if m == 1:
                                print("Or")
                            elif m == 1:
                                print("Argent")
                            elif m == 1:
                                print("Bronze")
                             
                            print("bonjour !")

                            à comparer avec:

                            m = 1
                            print(m)
                             
                            if m==1:
                                print("Or")
                            if m==1:
                                print("Argent")
                            if m==1:
                                print("Bronze")
                             
                            print("bonjour!")

                            Bon d'accord on n'écrit pas des codes comme çà, c'est juste une illustration.


                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 juillet 2021 à 19:23:45

                              Oui oui

                              -
                              Edité par Nguemetajoel 29 juillet 2021 à 19:25:43

                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 juillet 2021 à 19:27:20

                                josmiley a écrit:

                                Le "problème" du switch sous forme de dictionnaire, c'est que le dictionnaire est entièrement évalué.


                                Désolé, je n'ai pas compris ce que tu voulais dire par entièrement évalué...

                                Il sera à mon sens créé, après c'est un appel à un index.

                                J'ai peut-être pas tout compris à cette phrase...

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                  29 juillet 2021 à 19:29:11

                                  l'utilisation des dictionnaires comme structure conditionnel est aussi génial. surtout dans le cas des callback
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 juillet 2021 à 19:43:32

                                    Je parlais des dictionnaires dont les clés sont des évaluations.

                                    monSwitch = lambda x: {x==0:"zero",
                                                           x<0:"negatif",
                                                           x>0:"positif"}[True]
                                                           
                                    
                                    print(monSwitch(x=5))
                                    



                                    -
                                    Edité par josmiley 29 juillet 2021 à 19:56:37

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Python c'est bon, mangez-en. 

                                      29 juillet 2021 à 21:04:17

                                      On peut peut-être éviter ça avec des astuces, du genre,

                                      monSwitch = lambda x: {
                                          '0':"zero",
                                          '-':"negatif"
                                          }.get(x[0], "positif")
                                      
                                      print(monSwitch(x='0'))
                                      



                                      -
                                      Edité par fred1599 29 juillet 2021 à 21:05:46

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                        30 juillet 2021 à 10:17:49

                                        josmiley a écrit:

                                        Je parlais des dictionnaires dont les clés sont des évaluations.

                                        monSwitch = lambda x: {x==0:"zero",
                                                               x<0:"negatif",
                                                               x>0:"positif"}[True]
                                                               
                                        
                                        print(monSwitch(x=5))
                                        



                                        Oui, fatalement, si chaque switch construit un dictionnaire, on ne peut pas factoriser l'évaluation. Mais les perfs ne sont pas aussi mauvaises que je pensais :

                                        from random import randrange
                                        from time import perf_counter
                                        
                                        monSwitch = lambda x: {x==0:"zero",
                                                               x<0:"negatif",
                                                               x>0:"positif"}[True]
                                        
                                        altSwitch1 =lambda x:(x<0)*"negatif"or (x>0)*"positif" or "zero"
                                        altSwitch2 =lambda x:(x==0)*"zero"+(x<0)*"negatif"+(x>0)*"positif"
                                        
                                        fast=lambda x: "positif" if x>0 else "negatif" if x<0 else "zero"
                                        
                                        def ok(x):
                                            if x>0:
                                                return "positif"
                                            if x<0:
                                                return "negatif"
                                            return "zero"
                                        
                                        
                                        N=5*10**6
                                        L=[randrange(-100,101) for _ in range(N)]
                                        
                                        print("data ready")
                                        
                                        
                                        # -----------------------------------------
                                        
                                        begin_perf = perf_counter()
                                        
                                        R1=[monSwitch(x) for x in L]
                                        
                                        delta = perf_counter() - begin_perf
                                        
                                        print(f"dict : {delta:.2f}s")
                                        
                                        # -----------------------------------------
                                        
                                        begin_perf = perf_counter()
                                        
                                        R2=[altSwitch1(x) for x in L]
                                        
                                        delta = perf_counter() - begin_perf
                                        
                                        print(f"concat 1: {delta:.2f}s")
                                        
                                        # -----------------------------------------
                                        
                                        begin_perf = perf_counter()
                                        
                                        R3=[altSwitch2(x) for x in L]
                                        
                                        delta = perf_counter() - begin_perf
                                        
                                        print(f"concat2 : {delta:.2f}s")
                                        
                                        # -----------------------------------------
                                        
                                        begin_perf = perf_counter()
                                        
                                        R4=[ok(x) for x in L]
                                        
                                        delta = perf_counter() - begin_perf
                                        
                                        print(f"ok : {delta:.2f}s")
                                        
                                        # -----------------------------------------
                                        
                                        begin_perf = perf_counter()
                                        
                                        R5=[fast(x) for x in L]
                                        
                                        delta = perf_counter() - begin_perf
                                        
                                        print(f"fast : {delta:.2f}s")
                                        # -----------------------------------------
                                        
                                        print(R4==R1==R2==R3==R5)
                                        
                                        data ready
                                        dict : 0.96s
                                        concat 1: 0.61s
                                        concat2 : 0.89s
                                        ok : 0.41s
                                        fast : 0.44s
                                        True
                                        






                                        -
                                        Edité par PascalOrtiz 30 juillet 2021 à 11:07:56

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          30 juillet 2021 à 11:25:17

                                          il manquerait presque la fonction ok avec l'utilisation du elif  (on reste dans des temps voisins de la fonction ok)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            30 juillet 2021 à 14:03:22

                                            umfred a écrit:

                                            il manquerait presque la fonction ok avec l'utilisation du elif  (on reste dans des temps voisins de la fonction ok)


                                            Tu veux dire le code suivant :

                                            def okbis(x):
                                                if x>0:
                                                    r= "positif"
                                                elif x<0:
                                                    r= "negatif"
                                                else:
                                                    r= "zero"
                                                return r

                                            ?

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              2 août 2021 à 21:39:35

                                              Merci pour toutes vos réponses
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Quelle est la difference entre if et elif ?

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown