Quelle est la syntaxe correcte pour «sinon si»?

284

Je suis un nouveau programmeur Python qui fait le saut de 2.6.4 à 3.1.1. Tout s'est bien passé jusqu'à ce que j'essaie d'utiliser la déclaration «sinon si». L'interprète me donne une erreur de syntaxe après le «si» dans «sinon si» pour une raison que je n'arrive pas à comprendre.

def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

function(input('input:'))

Il me manque probablement quelque chose de très simple; cependant, je n'ai pas pu trouver la réponse par moi-même.

Paul Turner
la source
3
Je ne pense pas que cela fonctionne en 2.6.4.
wRAR
En effet, cet élément de la syntaxe et de la sémantique Python n'a pas changé entre ces versions. Peut-être jamais du tout.
Mike Graham
Vous pouvez commencer par un bon tutoriel sur if / else en python: dreamsyssoft.com/python-scripting-tutorial/ifelse-tutorial.php
Triton Man

Réponses:

444

En python "else if" s'écrit "elif".
De plus, vous avez besoin de deux points après le elifet le else.

Réponse simple à une question simple. J'ai eu le même problème quand j'ai commencé (au cours des deux dernières semaines).

Donc, votre code devrait lire:

def function(a):
    if a == '1':
        print('1a')
    elif a == '2':
        print('2a')
    else:
        print('3a')

function(input('input:'))
Lyndon White
la source
11
pas de soucis, nous devons tous apprendre un jour. Je trouve bizarre que python place une telle elphisise sur la lisibilité et va ensuite utiliser elkif au lieu de cela. Je suggère de garder le manuel de l'API python ouvert à tout moment: docs.python.org/3.1 les liens importants sont Tutoriel: docs.python.org/3.1/tutorial/index.html Référence du langage: docs.python.org/3.1/reference /index.html Référence de la bibliothèque: docs.python.org/3.1/library/index.html
Lyndon White
1
Perl utilise le même mot-clé, et sa raison d'être était de prévenir les accidents lorsque vous oubliez de terminer l'écriture d'une instruction else précédente et que vous commencez à écrire une autre instruction if. Apparemment, c'était un problème courant lors de l'écriture de code C.
Nate Glenn
1
@NateGlenn Perl en fait usage elsif, je suppose que Python devait être que l' un caractère plus efficace. "Elif" semble provenir du préprocesseur C, utilisé #elifbien avant Python AFAICT. De toute évidence, dans ce contexte, avoir une directive à jeton unique est précieux, car l'analyse #else if <code>vs. #else <code that could theoretically even be an if statement>aurait compliqué une syntaxe qui était censée être simple.
FeRD
20

Tu veux dire elif?

Nick Presta
la source
13
def function(a):
    if a == '1':
        print ('1a')
    elif a == '2':
        print ('2a')
    else:
        print ('3a')
À M
la source
10

depuis les temps anciens, la syntaxe correcte pour if/else ifen Python est elif. Par ailleurs, vous pouvez utiliser le dictionnaire si vous avez beaucoup de if/else.eg

d={"1":"1a","2":"2a"}
if not a in d: print("3a")
else: print (d[a])

Pour msw, exemple d'exécution de fonctions à l'aide d'un dictionnaire.

def print_one(arg=None):
    print "one"

def print_two(num):
    print "two %s" % num

execfunctions = { 1 : (print_one, ['**arg'] ) , 2 : (print_two , ['**arg'] )}
try:
    execfunctions[1][0]()
except KeyError,e:
    print "Invalid option: ",e

try:
    execfunctions[2][0]("test")
except KeyError,e:
    print "Invalid option: ",e
else:
    sys.exit()
ghostdog74
la source
1
Vous pouvez, mais ne faites pas cela. Un dictionnaire n'est pas un bon remplacement pour un elif.
S.Lott
@ s.lott, le cas d'OP est simple. S'il doit vérifier plusieurs valeurs de a, un dictionnaire est plus net. vous pourriez prendre l'habitude de ne pas l'utiliser, mais je l'ai utilisé et j'aime mieux cette approche que d'en coder beaucoup si / sinon. diable, j'utilise même le dictionnaire pour exécuter des fonctions.
ghostdog74
1
@ghostdog: Je sais que vous pouvez utiliser des dictionnaires pour exécuter des fonctions, mais l'idée me fait peur comme des gotos calculés ou le collage de chaînes Tcl ensemble et les execing. Est-ce une bonne pratique? Pouvez-vous citer un exemple?
msw
@msw: C'est une très bonne pratique. Exemple: vous lisez un flux XML non pas pour un exercice de grattage simple mais pour lequel vous devez effectuer un traitement différent pour différentes balises d'élément, par exemple, un fichier tableur Excel 2007 est un zip de plusieurs documents XML, certains très complexes. Vous avez une méthode distincte pour chaque balise. Vous expédiez via un dictionnaire. Rien à craindre. Si la méthode de gestion <foo>est do_foo, vous pouvez même créer le dict à la volée au démarrage de l'application.
John Machin
1
Notez que le dictionnaire a une .getméthode qui vous permet de spécifier une valeur par défaut. Votre premier exemple peut être écrit commeprint d.get(a, "3a")
codeape
4

Voici un petit refactoring de votre fonction (il n'utilise pas "else" ou "elif"):

def function(a):
    if a not in (1, 2):
        a = 3
    print(str(a) + "a")

@ ghostdog74: Python 3 nécessite des parenthèses pour "imprimer".

Winston C. Yang
la source
python 3 a remplacé l'instruction print de python 2 par une fonction donc les parenthèses requises, et si vous y allez pour que vous puissiez tout aussi bien utiliser sys.stdout.write
Dan D.
2
devrait être ('1', '2'), l'op utilise des cordes
prêtrec
2
def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

Doit être corrigé en:

def function(a):
    if a == '1':
        print('1a')
    elif a == '2':
        print('2a')
    else:
        print('3a')

Comme vous pouvez le voir, sinon if devrait être changé en elif, il devrait y avoir des deux points après '2' et sinon, il devrait y avoir une nouvelle ligne après l'instruction else, et fermer l'espace entre print et les parenthèses.

MilkyWay90
la source