Est-ce que 'if'/'for'en une ligne est un bon style Python?

de temps en temps ici je vois le code de quelqu'un et ce qui semble être un "one-liner", c'est-à-dire une déclaration d'une ligne qui exécute de la manière standard une traditionnelle Boucle " if " OU " for " fonctionne.

j'ai cherché sur Google et je ne peux pas vraiment trouver quel genre de que vous pouvez effectuer? Quelqu'un peut-il donner des conseils et de préférence des exemples?

Par exemple, j'ai pu le faire en une seule ligne:

example = "example"
if "exam" in example:
    print "yes!"

Ou:

for a in someList:
    list.append(splitColon.split(a))
40
demandé sur smci 2009-11-13 15:47:59

10 réponses

Eh bien,

if "exam" in "example": print "yes!"

Est-ce une amélioration? Aucun. Vous pouvez même ajouter d'autres énoncés au corps du if - les séparer par un point-virgule. Je recommande contre cela cependant.

53
répondu Stephan202 2009-11-13 12:50:41

j'ai constaté que dans la majorité des cas, faire bloc clauses sur une ligne est une mauvaise idée.

il va, encore une fois comme une généralité, réduire la qualité de la forme du code. Forme de code de haute qualité est une caractéristique de langage clé pour python.

dans certains cas, python offrira des moyens de faire des choses sur une ligne qui sont certainement plus pythoniques. Des choses comme ce que Nick D a mentionné avec la liste compréhension:

newlist = [splitColon.split(a) for a in someList]

bien que, sauf si vous avez besoin d'une réutilisables liste spécifiquement vous pouvez envisager d'utiliser un générateur au lieu

listgen = (splitColon.split(a) for a in someList)

notez la plus grande différence entre les deux est que vous ne pouvez pas répéter sur un générateur, mais il est plus efficace à utiliser.

il y a aussi un opérateur ternaire intégré dans les versions modernes de python qui vous permet de faire des choses comme

string_to_print = "yes!" if "exam" in "example" else ""
print string_to_print

ou

iterator = max_value if iterator > max_value else iterator

certaines personnes peuvent les trouver plus lisibles et utilisables que les semblables if (condition): bloc.

quand il s'agit de cela, il s'agit de code style et quelle est la norme avec l'équipe sur laquelle vous travaillez. C'est le plus important, mais en général, je déconseillerais d'une ligne de blocs que la forme du code en python est très important.

39
répondu Bryan McLemore 2009-11-13 13:31:32

plus généralement, tous les éléments suivants sont valides syntaxiquement:

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...etc.

18
répondu Cory Petosky 2009-11-13 12:50:58

un exemple d'une fonctionnalité de langue qui ne supprime pas seulement les sauts de ligne, bien que toujours pas convaincu que c'est plus clair que la version plus verbeuse

a = 1 si x > 15 autrement 2

11
répondu mbehan 2012-04-30 09:35:56
for a in someList:
    list.append(splitColon.split(a))

vous pouvez réécrire ce qui précède comme:

newlist = [splitColon.split(a) for a in someList]
7
répondu Nick Dandoulakis 2009-11-13 13:10:09

Python vous permet de mettre la clause indentée sur la même ligne si c'est une seule ligne:

if "exam" in example: print "yes!"

def squared(x): return x * x

class MyException(Exception): pass
6
répondu Ned Batchelder 2009-11-13 12:51:36

Vous pourriez faire tout cela en une seule ligne en omettant l' example la variable:

if "exam" in "example": print "yes!"
3
répondu Dominic Rodger 2009-11-13 12:51:12

les anciennes versions de Python ne permettent qu'une simple déclaration après for ...:if ...: ou des déclarations liminaires similaires en bloc.

je vois qu'on peut avoir plusieurs déclarations simples sur la même ligne que n'importe laquelle d'entre elles. Cependant, il existe différentes combinaisons qui ne fonctionnent pas. Par exemple, nous pouvons:

for i in range(3): print "Here's i:"; print i

... mais, d'autre part, nous ne pouvons pas:

for i in range(3): if i % 2: print "That's odd!"

Nous pouvons:

x=10
while x > 0: print x; x-=1

... mais nous ne peut pas:

x=10; while x > 0: print x; x-=1

... et ainsi de suite.

en tout état de cause, tous ceux-ci sont considérés comme extrêmement NON-pythoniques. Si vous écrivez du code comme celui-ci, alors l'expérience Pythonistas aura probablement une faible vue de vos compétences.

il est légèrement acceptable de combiner plusieurs énoncés sur une même ligne dans certains cas. Par exemple:

x=0; y=1

... ou encore:

if some_condition(): break

... pour la simple breakcontinue et même return déclarations ou assignations.

en particulier si l'on doit utiliser une série de elif on pourrait utiliser quelque chose comme:

if     keystroke == 'q':   break
elif   keystroke == 'c':   action='continue'
elif   keystroke == 'd':   action='delete'
# ...
else:                      action='ask again'

... vous n'irriterez peut-être pas trop vos collègues. (Toutefois, des chaînes de elif comme ce cri pour être refactorisé dans une table de répartition ... un dictionnaire qui pourrait ressembler à:

dispatch = {
    'q': foo.break,
    'c': foo.continue,
    'd': foo.delete
    }


# ...
while True:
    key = SomeGetKey()
    dispatch.get(key, foo.try_again)()
3
répondu Jim Dennis 2015-09-02 05:52:42

Plongée en python a un peu où il parle de ce qu'il appelle le et-ou truc, ce qui semble être un moyen efficace pour ancrer une logique complexe dans une seule ligne.

Fondamentalement, il simule l'opérateur ternaire en c, en vous donnant un moyen de tester la vérité et de retourner une valeur. Par exemple:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
0
répondu Dan Monego 2012-08-04 01:54:02

Ceci est un exemple de "if else" avec des actions.

>>> def fun(num):
    print 'This is %d' % num
>>> fun(10) if 10 > 0 else fun(2)
this is 10
OR
>>> fun(10) if 10 < 0 else 1
1
0
répondu Arindam Roychowdhury 2016-04-25 04:37:51