11
votes

meilleure façon que d'utiliser si-autre déclaration en python

Duplicaté possible: strong>

Mettre une déclaration simple si-alors sur une ligne p>

Je travaille sur une expression de Python et je veux que cette expression soit comprimée que d'utiliser la déclaration si d'autre. P>

s = [1, 2, 3, 4]
if len(s)>5:
    print s.index(5)
else:
    print 'cant print'


5 commentaires

Il semble exister un consensus général qu'un énoncé if / else est la meilleure façon de l'écrire.


Je devine juste ici, mais il semble que les intentions de l'OP sont d'éviter le si / elif / case / commutateur la laideur. Quelle solution ultime serait une solution de classe, où la sélection de cas est effectuée par le polymorphisme. Cela peut conduire à un code plus concis.


Après la dernière modification, il semble que l'OP ne veut que la vérification de la portée ...?


oui en fait, si cet index présent, alors seulement je veux trouver cet élément de cet index


@Don: Désolé, j'ai essayé de demander de manière plus simple.


5 Réponses :


17
votes

Vous pouvez faire:

s = [1, 2, 3, 4]
print 'y' if len(s) > 5 else 'n'


1 commentaires

D'accord, cela rencontre la demande de POS, mais n'entraîne pas de code plus lisible. +1 (à contrecœur à cause de l'obfuscation)



12
votes

short, mais très obscurcié (ne fais pas cela):

if s_is_long:
    print 'y'
else:
    print 'n'


8 commentaires

Comment ça marche? Python convert-il les valeurs booléennes en entiers lors de l'indexation?


Bien que techniquement correct, c'est une réponse terrible imo. Pour beaucoup de gens, il sera difficile de comprendre à première vue. Étant donné que les réponses à cette question seront la plus souvent lues par les personnes nouvelles pour la langue et / ou la nouvelle programmation de la programmation en général, je ne pense pas que ces constructions soient une bonne idée.


Les bools Python sont des intenses (dans le isinstance sens - BOOL est une sous-classe d'int).


@Levon: Vous n'avez même pas besoin int () ; true == 1 .


@Bryan Notez que j'ai explicitement dit "ne fais pas cela", alors je ne l'appellerais pas une suggestion.


Je veux vraiment upérer cela parce que c'est une sorte de cool de savoir, mais c'est vraiment vraiment obscurci (comme l'affiche lui-même) et un code sujet aux erreurs, mais ne le fera donc pas. Certaines des personnes qui vont lire ce sera probablement le moins équipé pour l'utiliser.


@thebjorn: Ah d'accord, les booléens sont des entiers en python. Ensuite, ça a du sens.


@thebjorn: tandis que "(ne fais pas cela)" est meilleur que rien, votre réponse serait meilleure si vous dépensiez un peu plus d'effort pour expliquer pourquoi quelqu'un ne devrait pas le faire. Rappelez-vous: le public est surtout des personnes qui peuvent ne pas savoir pourquoi c'est une mauvaise idée. C'est votre chance de les éduquer.



3
votes

court et clair: xxx


6 commentaires

Rien contre votre solution, mais je pense que le code d'origine de l'OP est aussi "court et clair" est-il possible de prendre en compte la lisibilité.


Vous avez raison, mais j'ai décidé de le poster comme "le bon sens" d'éviter si-... au lieu de compter sur une coulée implicite sans papiers pouvant être modifiée au fil du temps.


La solution de Zenopy est courte, claire et n'est pas sans élégance ;-)


@zenpoy c'est une bonne raison (et il est certainement plus clair que le code Cerfondrement intelligemment et cool, mais obscurcissant le code qui dépend des valeurs de vrai / faux)


@zenpoy tandis que le fait que bool est-a int peut être obscur, il n'est ni un casting implicite (c'est un sous-type) ni sans papiers (voir Justification de PPE 285: < Un href = "http://www.python.org/dev/peps/pep-0285/" rel = "nOfollow noreferrer"> python.org/dev/peps/pep-0285 ). Mais oui, c'est certainement obscur :-)


@thebjorn bien de savoir! Merci pour le lien...



0
votes

Une autre variante:

print len(s)>5 and 'y' or 'n'


3 commentaires

Je vous donnerais des points pour la valeur archéologique, mais sinon cette horriblement est la raison pour laquelle nous avons eu des expressions si elles ont eu des expressions dans la langue.


@thebjorn attend, il y avait une version de Python sans expressions?


@Marcin Si-Expressions ont été introduites dans 2,5, avant que nous ayons juste eu des déclarations si :-)



7
votes

Dans ce cas, vous pouvez utiliser l'essai / à l'exception du bloc: xxx


2 commentaires

Puis-je demander pourquoi? c'est un "pythonic" wy à l'utiliser! "Ne demandez pas la permission, mais pour le pardonnant!" - Votre clause IF-Clause demande la permission et fait ensuite ce qu'elle a demandé. La déclaration try a juste-t-elle et si elle échoue, elle gère la partie de défaut de défaut.


Basé sur le commentaire de OP sur la question elle-même, il semble que cela signifiait réellement s [5] (qui en ferait une indexerror). Mais je suis d'accord, c'est la méthode de vérification de la plage d'orthophonie évidemment pythonique.