2010-05-10 7 views
461

Possible en double:
Python Ternary OperatorMettre une simple déclaration if-then-else sur une ligne

Je suis juste en Python et je vraiment le laconisme de la syntaxe. Cependant, y a-t-il un moyen plus facile d'écrire une déclaration if - then - else pour qu'il ne puisse contenir qu'une seule ligne?

Par exemple:

if count == N: 
    count = 0 
else: 
    count = N + 1 

est-il un moyen plus simple d'écrire cela? Je veux dire, en Objective-C Je voudrais écrire cela comme:

count = count == N ? 0 : count + 1; 

Y at-il quelque chose de similaire pour Python?

Mise à jour

Je sais que dans ce cas, je peux utiliser count == (count + 1) % N.

Je pose des questions sur la syntaxe générale.

+0

Si pas être 'count = count == N? 0: N + 1; 'au lieu de' count = count == N? 0: compte + 1; '? –

+1

Pour ce cas spécifique: count = (count + 1)% (N + 1) fonctionnerait. –

+0

Vous pouvez faire un si-alors sur une ligne. '' 'if 1 == 1: print (' hi ')' '' – Chogg

Répondre

902

C'est plus précisément une expression ternary operator qu'un if-then, voici la syntaxe python

value_when_true if condition else value_when_false 

Meilleur exemple: (merci Mr. Burns)

'Yes' if fruit == 'Apple' else 'No'

Maintenant, avec l'affectation et contraster avec si la syntaxe

fruit = 'Apple' 
isApple = True if fruit == 'Apple' else False 

vs

fruit = 'Apple' 
isApple = False 
if fruit == 'Apple' : isApple = True 
+1

Cela ressemble beaucoup à une compréhension. Vous pouvez faire ceci: 'print ('apparié!' Si re.match (r '\ d {4,}', '0aa9') else" nopes ")' (en supposant que vous réimporter) – uchuugaka

+5

Notez que la syntaxe sténographique est Valable uniquement pour les valeurs réelles. Vous pouvez l'utiliser avec des constantes et des fonctions ('Yes 'si fruit ==' Apple 'else imprimer (' No Apple ')'), mais pas avec des mots-clés (' 'Yes' si fruit == 'Apple' soulève une exception ('No Apple') ') – Torben

+0

Il n'est pas clair pour moi si je peux omettre autre chose, puis-je simplement avoir 'Oui' si fruit == 'Apple'? – Miro

96
count = 0 if count == N else N+1 

- l'opérateur ternaire. Bien que je dirais que votre solution est plus lisible que cela.

+5

@ THC4k: Pourquoi les parenthèses? Ils ne semblent pas nécessaires et ne sont pas mentionnés dans PEP-308 ou les docs (http://docs.python.org/reference/expressions.html#conditional-expressions) –

+0

Ouais, ils ne sont pas nécessaires. Je ne sais pas où j'ai pris l'habitude - je pensais que c'était suggéré dans PEP8, mais je ne peux pas le trouver. –

+0

OK, alors je vais les retirer à nouveau :) –

69

syntaxe ternaire générale:

value_true if <test> else value_false 

Une autre façon peut être:

[value_false, value_true][<test>] 

par exemple:

count = [0,N+1][count==N] 

Cette évalue les deux branches avant de choisir un. Pour évaluer uniquement la branche choisie:

[lambda: value_false, lambda: value_true][<test>]() 

par exemple.:

count = [lambda:0, lambda:N+1][count==N]() 
+2

Cela compte sur un détail d'implémentation qui '(False, True) == (0, 1)' que je ne sais pas est garanti (mais n'a pas vérifié). Et bien que laconique, il ne va pas gagner de prix de lisibilité. Vous pouvez aussi faire '' abcdefg '[i] 'en C, mais cela ne veut pas dire que vous devriez le faire. – msw

+6

@msw: Il est garanti que 'False == 0' et' True == 1': aucun détail d'implémentation ici. :) Voir l'entête 'Booleans' sous http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy –

+10

Mais les deux valeurs ne sont-elles pas calculées, peu importe ce que [] est? – tstenner

15
<execute-test-successful-condition> if <test> else <execute-test-fail-condition> 

avec votre bout de code, il deviendrait,

count = 0 if count == N else N + 1 
87

De plus, vous pouvez toujours utiliser le « ordinaire » si la syntaxe et amalgamer dans une ligne avec le côlon.

if i > 3: print("We are done.") 

ou

field_plural = None 
if field_plural is not None: print("insert into testtable(plural) '{0}'".format(field_plural)) 
+5

Quelqu'un peut-il expliquer pourquoi ce n'est pas la meilleure réponse? C'est certainement le plus facile à lire à mon humble avis. – keithhackbarth

+14

la question incluait une condition "else" –

+2

@ johannes-braunias Votre méthode va à l'encontre des normes PEP8. –

Questions connexes