OVH Cloud OVH Cloud

Equivalent du (a ? b : c) du C ?

17 réponses
Avatar
Nicolas Pourcelot
Bonjour,
je voudrais remplacer le (a ? b : c) du C par un équivalent python.
Je sais qu'en général on peut le faire avec ( a and b or c), mais ça
pose problème si b peut s'annuler.
Il me semble qu'il y a une astuce, mais je ne m'en rappelle plus ;-)
Merci d'avance !

Nicolas

10 réponses

1 2
Avatar
Guillaume Bouchard
Nicolas Pourcelot wrote:
Bonjour,


Bonjour

je voudrais remplacer le (a ? b : c) du C par un équivalent python.

Il me semble qu'il y a une astuce, mais je ne m'en rappelle plus ;-)


('toto','bubu')[5 > 5]
'toto'



('toto','bubu')[5 >= 5]
'bubu'




Maitenant j'ai la vague impression que c'est gore comme méthode.

--
Guillaume.



Avatar
tiissa
Nicolas Pourcelot wrote:
je voudrais remplacer le (a ? b : c) du C par un équivalent python.
Je sais qu'en général on peut le faire avec ( a and b or c), mais ça
pose problème si b peut s'annuler.


J'ai déjà croisé la variante : (a and (b,) or (c,))[0] qui ne pose pas
le même problème puisque le seul tuple faux est vide.

D'un autre côté, j'étais fan du ?: en C mais je ne l'ai utilisé qu'une
fois en python. Ca vient peut-être de ce que j'attend de python par
rapport à C. ;)

Avatar
Nicolas Pourcelot
('toto','bubu')[5 > 5]
'toto'



('toto','bubu')[5 >= 5]
'bubu'




Maitenant j'ai la vague impression que c'est gore comme méthode.

Disons qu'il faut un peu s'habituer à la syntaxe ;)

C'est une solution astucieuse en tout cas, je n'y aurais pas pensé !

Nicolas




Avatar
Nicolas Pourcelot
Nicolas Pourcelot wrote:

je voudrais remplacer le (a ? b : c) du C par un équivalent python.
Je sais qu'en général on peut le faire avec ( a and b or c), mais ça
pose problème si b peut s'annuler.



J'ai déjà croisé la variante : (a and (b,) or (c,))[0] qui ne pose pas
le même problème puisque le seul tuple faux est vide.

D'un autre côté, j'étais fan du ?: en C mais je ne l'ai utilisé qu'une
fois en python. Ca vient peut-être de ce que j'attend de python par
rapport à C. ;)


Il me semble que c'était ça en effet... c'est moins joli que j'espérais ;)
C'est vrai que je me servais beaucoup du ?: en C, puis en PHP, et j'ai
gardé l'habitude ; ça fait du code plus court, mais pas forcément plus
lisible !

Nicolas


Avatar
Do Re Mi chel La Si Do
Bonsoir !


Même chose que Guillaume, mais avec les noms utilisés pas Nicolas :

b="bbb"
c="ccc"

a=True
print (b,c)[a]

aúlse
print (b,c)[a]


Michel Claveau
Avatar
tiissa
Le gros probleme c'est a propos de la definition des valeurs de verite.
None, False, 0, (), [], {} et quelques autres sont faux, et tout le
reste est vrai, dont 2.

Dans le cas du a?b:c, a est une expression quelconque evaluee pour sa
valeur booleenne. De meme pour a and b or c.
Par contre, dans (c,b)[a] c'est une semantique d'indice qui est
differente.

Avec par exemple :
a=len(f.readlines())
on peut donc ecrire :
print a and "Des lignes." or "Rien."
mais pas :
print ("Rien", "Des lignes.")[a]

Donc l'indicage n'est equivalent que dans le cas ou on l'utilise avec
des expressions booleennes mais pas dans le cas general comme
l'operateur ternaire du C.
Avatar
Gilles Lenfant
Nicolas Pourcelot wrote:

Bonjour,



Bonjour

je voudrais remplacer le (a ? b : c) du C par un équivalent python.



Il me semble qu'il y a une astuce, mais je ne m'en rappelle plus ;-)



('toto','bubu')[5 > 5]
'toto'



('toto','bubu')[5 >= 5]
'bubu'




Maitenant j'ai la vague impression que c'est gore comme méthode.



Pas exactement, puisque dans la traduction Python "b" et "c" sont
évalués systématiquement quelque soit le résultat du test (ce qui
n'optimise pas la chose), alors qu'en C, seule l'expression nécessaire
(b ou c) est exécutée.

--
Gilles




Avatar
f
Nicolas Pourcelot wrote:
Bonjour,
je voudrais remplacer le (a ? b : c) du C par un équivalent python.
Je sais qu'en général on peut le faire avec ( a and b or c), mais ça
pose problème si b peut s'annuler.
Il me semble qu'il y a une astuce, mais je ne m'en rappelle plus ;-)
Merci d'avance !

Nicolas


http://www.python.org/doc/Humor.html :

...
The Zen of Python (by Tim Peters) :

...
Explicit is better than implicit.
...

mettre if/else et appuyer sur "entré" ça fatigue mais des fois ... c'est
plus clair, surtout pour ceux qui passent derrière :o)

Avatar
Laurent Coustet
f wrote:
Nicolas Pourcelot wrote:
mettre if/else et appuyer sur "entré" ça fatigue mais des fois ... c'est
plus clair, surtout pour ceux qui passent derrière :o)


I Agree ;)

Avatar
Erwan Scouarnec
Laurent Coustet wrote:
f wrote:

Nicolas Pourcelot wrote:
mettre if/else et appuyer sur "entré" ça fatigue mais des fois ...
c'est plus clair, surtout pour ceux qui passent derrière :o)



I Agree ;)
I Agree ;)



1 2