Python idiome pour... si ... sinon ...' expression
Comment écrire l'expression plus courte:
return '%.0f' % float_var if float_var else float_var
ou
if float_var:
return formatted_string
else:
return None
Merci!
- "Plus court"? Votre premier exemple est bien évidemment "plus court". Pourquoi demandez-vous ce qui est plus court? Demandez-vous pour un troisième exemple qui est comme par magie encore plus courte? Étant donné que votre question montre qui est plus court, il n'est pas clair ce que vous devez savoir.
- Les deux exemples qui ne sont même pas le même code. Outre l'évidente (apparemment pré-calcule "formatted_string" dans certains unshown de la mode), le second renvoie
None
où les premiers retoursfloat_var
, qui pourrait êtreNone
, ouFalse
, ou0.0
, ou quelques autres choses... Qui upvotes ces choses de toute façon? - Hansen: Bonne question. Je ne peux même pas à interpréter la question et qu'il a déjà eu upvotes. Je souhaite que les upvoters laisserait un "+1..." observations sur la raison pour laquelle la question est tellement cool.
- Hansen, @S. Lott: l'Interprétation de StackOverflow questions est plus un art qu'une science. pour ma réponse ci-dessous, j'ai interprété cette un pour dire "je sais que les deux façons d'écrire un if-else condition ternaire. Est-il une façon plus simple? Quand devrais-je utiliser un?"
Vous devez vous connecter pour publier un commentaire.
L'expression
<value> if <condition> else <other_value>
est assez idiomatiques déjà -- certainement plus que l'autre, et il est probablement préférable d'utiliser autant que<value>
est simple. C'est Python opérateur ternaire, donc si vous avez été la recherche de quelque chose comme<condition> ? <value> : <other_value>
, qui n'existe pas.Si le calcul de
<value>
ou<other_value>
prend que quelques étapes, l'utilisation la plusif: ... else: ...
alternative.Je voudrais utiliser des parenthèses pour rendre l'expression plus lisible:
Quand j'ai vu la première fois je l'ai lu comme
qui serait ridicule. J'avais essayer de faire sûr de la façon dont il a travaillé.
BTW Votre premier exemple, n'équivaut pas à votre deuxième exemple
Ce sera toujours retourne une chaîne formatée, ou Aucun. Votre premier exemple, si vous passez dans tout ce qui a la valeur False (Faux, 0, 0.0, "", [] etc) sera de retour que inchangée, de sorte que votre type de retour peut être string, boolean, liste, int, float, etc. Ce n'est probablement pas ce que vous voulez, surtout si 0.0 est une valeur légitime pour float_var. Je voudrais changer votre code:
sinon:
qui va travailler pour d'autres nombres entiers (et longs) en les convertissant en float.
"%.0f" % False
serait de retour"0"
, ce qui n'est pas souhaitable de trop.float
est toujours un signe d'avertissement. Si les deux classes de valeurs attendues sont des chiffres etNone
, il fait beaucoup plus de sens pour vérifieris not None
queisinstance(foo, float)
, puisque l'ancien, permet toujours de l'opération de canard tapé.Il n'est pas clair exactement ce que vous voulez faire.
La plupart interprétation littérale aurait-il comme ce
qui, j'en suis presque certain que vous ne souhaitez pas.
Je suppose que vous êtes désireux de vérifier
None
avec "if float_var
"? Si oui, vous avez toujours, il sort "if foo is not None
", pas "if foo
", la première étant plus clair et moins de bug sur le ventre.Si est ce que vous le souhaitez, je vous conseille de réviser votre modèle. La propagation des erreurs à plusieurs reprises de retourner
None
est une mauvaise chose: il est laid et bug et sujettes à des non-idiomatique. Utiliser les exceptions à la place.Plus court n'est pas toujours mieux. Vos extraits ne sont pas douloureusement longue ou difficile. En fait, vous aurez envie de leur faire un peu plus si vous les utilisez pour éviter un bug potentiel.
or
pour cela. Cependant, cela rend le code plus difficile à lire et ne vous permet pas de spécifier entreNone
et autres fausses valeurs, ce qui conduit souvent à des bugs.Si vous utilisez sont déjà à l'aide de
v if c else u
vous utilisez déjà le plus lisible et plus efficace de l'opérateur ternaire.Il y a d'autres moyens, mais ils souffrent en lisibilité.
N'est-ce pas génial?