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
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..
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.
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.
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.
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...
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)
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)
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
× 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.
Découverte Python Doc Tkinter Les chaînes de caractères
Python c'est bon, mangez-en.
Découverte Python Doc Tkinter Les chaînes de caractères
Python c'est bon, mangez-en.
Découverte Python Doc Tkinter Les chaînes de caractères
Le Tout est souvent plus grand que la somme de ses parties.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
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)
Python c'est bon, mangez-en.
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)
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères