web-dev-qa-db-fra.com

Les instructions 'if'/'for' à une ligne conviennent-elles au style Python?

De temps en temps ici, je vois le code de quelqu'un et ce qui semble être un "une ligne", c'est-à-dire une instruction d'une ligne qui exécute de manière standard une instruction traditionnelle "if" ou "pour".

J'ai cherché sur Google et je ne trouve pas vraiment quel genre de films tu peux jouer? Quelqu'un peut-il conseiller et de préférence donner quelques exemples?

Par exemple, pourrais-je 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
Federer

Bien,

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

Est-ce une amélioration? Non . Vous pouvez même ajouter d'autres instructions au corps de la clause if- en les séparant par un point-virgule. Je recommande contre que si.

53
Stephan202

J'ai constaté que dans la majorité des cas, la clause de blocage sur une ligne est une mauvaise idée.

De manière générale, cela réduira la qualité de la forme du code. Un code de haute qualité est une fonctionnalité clé du langage python.

Dans certains cas, Python offrira des façons de faire des choses sur une ligne qui sont nettement plus pythoniques. Des choses telles que ce que Nick D a mentionné avec la compréhension de la liste: 

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

cependant, à moins que vous n'ayez besoin d'une liste réutilisable, vous pouvez envisager d'utiliser un générateur à la place.

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

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

Il existe également 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 trouver ces informations plus lisibles et utilisables que le même bloc if (condition):.

En fin de compte, il s’agit du style de code et des standards de l’équipe sur laquelle vous travaillez. C'est le plus important, mais en général, je vous déconseille les blocs d'une ligne, car la forme du code en python est très importante.

39
Bryan McLemore

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
Cory Petosky

un exemple de fonctionnalité linguistique qui ne consiste pas uniquement à supprimer les sauts de ligne, bien que cela ne soit toujours pas convaincu que cela soit plus clair que la version plus détaillée

a = 1 si x> 15 sinon 2

11
mbehan
for a in someList:
    list.append(splitColon.split(a))

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

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

Python vous permet de mettre la clause indente sur la même ligne s'il ne s'agit que d'une ligne:

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

def squared(x): return x * x

class MyException(Exception): pass
6
Ned Batchelder

Les anciennes versions de Python n'autorisaient qu'une seule instruction simple après for ...:if ...: ou des instructions d'introduction de bloc similaires.

Je vois que l’on peut avoir plusieurs déclarations simples sur la même ligne. Cependant, il existe diverses combinaisons qui ne fonctionnent pas. Par exemple nous pouvons:

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

... mais d'un autre côté, 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 pouvons pas:

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

... etc.

En tout état de cause, tous ces éléments sont considérés comme extrêmement non pythoniques. Si vous écrivez un code comme celui-ci, alors l'expérience des pythonistes aura probablement une vue sombre de vos compétences.

Il est marginalement acceptable de combiner plusieurs déclarations sur une ligne dans certains cas. Par exemple:

x=0; y=1

... ou même:

if some_condition(): break

... pour de simples déclarations ou assignations breakcontinue et même return.

En particulier, si vous devez utiliser une série de Elif, vous pouvez utiliser quelque chose comme:

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

... alors vous pourriez ne pas énerver vos collègues. (Cependant, les chaînes de Elif comme celle-ci doivent être refactorisées dans une table de répartition ... un dictionnaire qui pourrait ressembler davantage à:

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


# ...
while True:
    key = SomeGetKey()
    dispatch.get(key, foo.try_again)()
4
Jim Dennis

Vous pouvez faire tout cela en une seule ligne en omettant la variable example:

if "exam" in "example": print "yes!"
3
Dominic Rodger

Plongez dans le langage python où il parle de ce qu'il appelle le truc ou-astuce , qui semble être un moyen efficace de transformer une logique complexe en une seule ligne.

En gros, il simule l'opérateur ternaire en c, en vous donnant un moyen de tester la vérité et de renvoyer une valeur en fonction de cela. Par exemple:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
0
Dan Monego

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