2009-03-13 5 views
7

Possible en double:
Ternary conditional operator in PythonQuelle est la meilleure façon de remplacer l'opérateur ternaire en Python?

Si j'ai un code comme:

x = foo ? 1 : 2 

Comment dois-je traduire en Python? Puis-je faire ceci?

if foo: 
    x = 1 
else: 
    x = 2 

Est-ce que x sera toujours dans la portée en dehors des blocs if/then? Ou dois-je faire quelque chose comme ça?

x = None 
if foo: 
    x = 1 
else: 
    x = 2 
+0

Une façon de le remplacer est de l'appeler par son nom correct. En Python c'est "l'expression conditionnelle". En C, c'est "l'opérateur conditionnel". En Java, c'est "l'opérateur conditionnel". –

Répondre

26

Utilisez l'opérateur ternaire (formellement conditional expression) dans Python 2.5+.

x = 1 if foo else 2 
+0

Seulement, s'il vous plaît appelez l'expression conditionnelle, puisque c'est ce que c'est. –

+0

@Adriano Varoli Piazza @ S.Lott ajouté à la réponse. Merci! – phihag

0

Vous pouvez utiliser quelque chose comme:

val = float(raw_input("Age: ")) 
status = ("working","retired")[val>65] 
print "You should be",status 

qu'il ne soit pas très pythonique

(les autres options sont plus proches de C/PERL, mais cela implique plus tuple magique)

1

en double de this one.

J'utilise cette (même si je suis en attente de quelqu'un pour downvote ou commenter si elle est incorrecte):

x = foo and 1 or 2 
+0

Cela fonctionne dans ce cas, mais il peut être dangereux en général: x = foo et bar ou baz produira baz si foo est vrai et bar est faux, ce qui n'est probablement pas ce que vous voulez. – Khoth

+0

ah, j'ai compris. Je l'ai utilisé pendant un certain temps, et je ne savais pas vraiment pourquoi ce n'était pas une méthode acceptée. Je peux voir ça maintenant. – jonstjohn

+0

Ce code est assez fragile. – ncmathsadist

5

L'opérateur ternaires mentioned est uniquement disponible à partir Python 2.5. De l'WeekeePeedeea:

Bien qu'il avait été retardée pendant plusieurs années par des désaccords sur la syntaxe, un opérateur ternaire pour Python a été approuvé comme Python Enhancement Proposition 308 et a été ajouté à 2,5 sortie en Septembre 2006

L'opérateur ternaire de Python diffère de de l'opérateur commun:: de l'ordre de ses opérandes; la forme générale est op1 if condition else op2. Ce formulaire invite à considérer op1 comme la valeur normale et op2 comme un cas exceptionnel.

Avant 2.5, on peut utiliser la syntaxe (lambda x:op2,lambda x:op1)[condition]() laide qui prend également soin de ne évaluer les expressions qui sont effectivement nécessaires pour prévenir les effets secondaires.

-1

Un truc joli python utilisant ceci:

foo = ["ifFalse","ifTrue"][booleanCondition] 

Il crée une 2 liste éléments, et le booléen devient 0 (false) ou 1 (vrai), qui choisit le membre correct. Pas très lisible, mais pythony :)

+0

Je ne serais ni lisible, ni pythonique, mais c'est toujours quelque chose que j'utilise tout le temps ... si vous faites cette astuce, faites-le comme un tuple: (trueFunc, falseFunc) [bool (condition)] –

+0

Le Python 2.5 l'expression conditionnelle n'évaluera qu'une seule des expressions trueFunc, falseFunc. Cette formule évalue les deux. –

+0

Utilisez (booleanCondition et [trueFunc] ou [falseFunc]) [0]. – ThomasH

2

J'utilise toujours le 2.4 dans un de mes projets et je l'ai rencontré plusieurs fois. La solution la plus élégante que je vois ai pour cela est:

x = {True: 1, False: 2}[foo is not None] 

J'aime parce qu'elle représente un test booléen plus clair que d'utiliser une liste avec les valeurs d'index 0 et 1 pour obtenir votre valeur de retour.

+0

"not not foo" serait mieux - les listes vides, les zéros et autres joyeusetés devraient aussi évaluer False. – Andreas

Questions connexes