J'ai ceci
bc = 'off'
if c.page == 'blog':
bc = 'on'
print(bc)
Existe-t-il une manière plus pythonique (et/ou plus courte) d'écrire ceci en Python ?
J'ai ceci
bc = 'off'
if c.page == 'blog':
bc = 'on'
print(bc)
Existe-t-il une manière plus pythonique (et/ou plus courte) d'écrire ceci en Python ?
C'est ça :
X if Z else Y
syntaxe)discutablement lisible. Avec ces réserves à l'esprit, c'est parti :
bc = ("off","on")[c.page=="blog"]
EDIT : Comme demandé, la forme généralisée est :
result = (on_false, on_true)[condition]
Explication : condition
peut être tout ce qui est évalué comme un booléen. Il est alors traité comme un entier puisqu'il est utilisé pour indexer le tuple : False == 0
, True == 1
qui sélectionne ensuite le bon élément dans le tuple.
Fascinant. Comme pour une autre personne ci-dessus, pourriez-vous généraliser un peu plus et expliquer cela ? (Comme dans ... vous ne plaisantiez pas avec le numéro 3).
Je voulais voter contre parce que c'est vraiment moche, puis je me suis souvenu que je l'ai utilisé moi-même.
Je ne suis pas un spécialiste de Python, mais j'ai écrit (et, avec plus de difficultés, lire ) beaucoup de code intelligent au fil des ans, je me retrouve maintenant avec une forte préférence pour le code lisible. J'ai compris l'essentiel de ce que faisait votre code original, même si je ne suis pas un spécialiste de Python. Bien sûr, vous pourriez le cacher et peut-être impressionner un ou deux spécialistes de Python, mais pourquoi ?
En C, on utilise i++. Le "si" pythique peut être utilisé comme raccourci pour des conditionnelles évidentes, tout comme i++ ou i+= peuvent être utilisés comme raccourcis pour des opérations évidentes.
@freiksenet : Je pense qu'une meilleure comparaison est l'utilisation des instructions ? : dans d'autres langues pour des conditionnels courts et simples -- en ligne --. Et, sans doute, celles-ci peuvent rendre le code plus lisible plutôt que de l'encombrer de lignes supplémentaires qui n'ajoutent aucune fonctionnalité.
Vous pouvez utiliser une instruction if en ligne :
>>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off'
Il y a un article sur cette fonctionnalité à l'adresse suivante ce blog et le PEP pertinent est PEP308 . L'instruction inline if a été introduite dans Python 2.5.
Celle-ci est moins pythique, mais vous pouvez utiliser and
/ or
de cette manière :
>>> cpage = 'asdf'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'off'
>>> cpage = 'blog'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'on'
Celle-ci est plus souvent utilisée dans des instructions lambda que sur une ligne par elle-même, mais la forme
A and B or C
est similaire à
if A:
return B
else:
return C
La principale mise en garde concernant cette méthode (comme PEP 308 mentionne ) est qu'il renvoie C
cuando B
est fausse.
Le deuxième semble realmente déroutant. Pouvez-vous développer la réponse pour expliquer pourquoi cela fonctionne ainsi ?
Merci pour l'explication. C'est toujours très illisible pour moi. Je pense que la première option est meilleure.
La deuxième option est ce que les gens utilisaient avant que nous ayons la première, dans les cas où il était plus important d'entasser les choses sur une ligne que de les lire
Une autre possibilité est d'utiliser un dict si vous pouvez calculer les valeurs en dehors de la fonction qui y accède (c'est-à-dire que les valeurs sont statiques, ce qui résout également le problème d'évaluation dans les commentaires de la réponse de scrible).
want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]
Je préfère cette solution et/ou celle de l'indexation des tuple, dans la mesure où je préfère le calcul aux tests.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
9 votes
Est-ce que vous ont pour utiliser 'on' et 'off' ? Est-ce que cette information pourrait être représentée par un simple booléen, je veux dire bc = (c.page == 'blog') est beaucoup mieux.