7
votes

Python idiome pour "... si ... autre ..." expression

Comment écrire l'expression plus courte: xxx

ou xxx

merci!


4 commentaires

"Plus court"? Votre premier exemple est évidemment "plus court". Pourquoi demandez-vous qui est plus courte? Demandez-vous un troisième exemple qui est par magie encore plus court? Étant donné que votre question montre qui est plus courte, ce n'est pas clair ce que vous devez savoir.


Les deux exemples ne sont même pas le même code. Mis à part de l'évidence (on pré-pré-calculer "formated_string" de manière inverse de la mode), le second retourne Aucun où le premier retour float_var , qui pourrait être Aucun ou FALSE ou 0.0 ou quelques autres choses ... qui évoquent ces choses quand même?


@Peter Hansen: bonne question. Je ne peux même pas interpréter la question et il a déjà eu des upvotes. Je souhaite que les UPVOTERS quittent des commentaires "+1 ..." sur la raison pour laquelle la question est si cool.


@Peter Hansen, @s. Lott: interpréter les questions sur Stackoverflow est plus un art qu'une science. Pour ma réponse ci-dessous, j'ai interprété celui-ci à dire: "Je sais deux façons d'écrire une condition ternaire if-sinon. Y a-t-il une manière plus courte? Quand devrais-je utiliser l'un ou l'autre?"


5 Réponses :


32
votes

L'expression si sinon est déjà idiomatique déjà - certainement plus que l'autre exemple, et est probablement préféré chaque fois que est simple. C'est l'opérateur ternaire de Python, donc si vous recherchez quelque chose comme ? : , cela n'existe pas.

Si calculant ou prend quelques étapes, utilisez le plus longtemps si: ... Alternative.


4 commentaires

en supposant que vous êtes en 2.5 en avant.


@Gregg: J'espère que c'est le cas - sinon vous utilisez 2,4 ou plus tôt, ce qui signifie que votre version de Python a au moins 6 ans!


Vérifiez Centos5 et d'autres distributions de serveur, John. Il y a encore beaucoup de 2,4 dans la nature sauvage, Ugh!


Merci à tous! Ma question ressemble à stupide, désolé, je sais. J'essaie juste d'apprendre et d'utiliser des idiomes Python.



1
votes

Si vous utilisez utilisez déjà V si C STRY U Vous utilisez déjà l'opérateur ternaire le plus lisible et le plus efficace.

Il y a Autres façons mais ils souffrent de lisibilité.


0 commentaires

6
votes

J'utiliserais des supports pour rendre l'expression plus lisible: xxx pré>

Quand je l'ai vu pour la première fois, je l'ai lu comme p>

try:
    return "%.0f" % float_var
except TypeError:
    return None


3 commentaires

@Dave, surtout bon, bien que cette dernière note de dernière lettre indique que "%. 0f"% faux retournerait "0" , ce qui pourrait être indésirable.


@Peter - Bon point, j'ai oublié la conversion automatique de True / Faux à 1/0.


Le typecheck pour float est toujours un signe d'avertissement. Si les deux classes de valeurs attendues sont des chiffres et Aucun , il est beaucoup plus logique de vérifier n'est pas Aucun que isinstance (foo, float) , étant donné que le premier permet toujours à l'opération d'être dactylographié.



2
votes
  • Ce n'est pas clair ce que vous voulez faire exactement. p>

    1. L'interprétation la plus littérale aurait-il fonctionné comme celle-ci p>

      >>> float_var = 4.5
      >>> '%.0f' % float_var if float_var else float_var
      '5' # This is a string
      >>> float_var = 0.0
      >>> '%.0f' % float_var if float_var else float_var
      0.0 # This is a float
      
    2. Je suppose que vous souhaitez rechercher Aucun code> avec " si float_var code>"? Si tel est le cas, vous l'épelez toujours " si foo n'est pas Aucun code>", pas " si foo code>", le premier étant plus clair et moins sujette de bogue. P>

      Si cela est em> ce que vous avez voulu, je vous suggère de réviser votre modèle. Appagation des erreurs en retournant à plusieurs reprises Aucun code> est une mauvaise chose: il est laid et le bug-suone et non idiomatique. Utilisez à la place des exceptions. P> li> ol> li>

    3. plus court n'est pas toujours meilleur. Vos extraits ne sont pas douloureusement longs ni maladroits. En fait, vous voudrez les faire un peu plus longtemps em> si vous les utilisez pour éviter un bogue potentiel. P>

      • Quelqu'un peut suggérer d'abuser du comportement de court-circuit de ou code> pour cela. Cependant, cela rend le code plus difficile à lire et ne vous permet pas de spécifier entre Aucun code> et d'autres fausses valeurs, ce qui conduit souvent à des bugs. LI> ul> li> ul>


0 commentaires

0
votes
float_var and "%.0f" % float_vav
Isn't it awesome?

2 commentaires

Nope: >>> f = 0,0 >>> x = f et "% F"% F >>> type (x) >>> f = 0,1 >>> x = f et "% f "% f >>> type (x) ... Si la valeur est 0.0, vous obtenez un flotteur, sinon une chaîne.


J'ai des sentiments mitigés à ce sujet. C'est un peu génial. Pour autant que je sache, il est logiquement équivalent à '% .0f'% float_var si float_var sinon float_var mais je ne l'utiliserais pas dans mon code. Je pense qu'il est difficile de lire. Peut-être que ce n'est que parce que cette astuce n'est pas idiomatique à Python et je ne l'ai jamais vue auparavant. Non, non, non, je n'écrirai jamais comme ça! Mais je suis impressionné.