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))
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.
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.
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.
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
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]
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
Vous pourriez faire tout cela en une seule ligne en omettant l' example
la variable:
if "exam" in "example": print "yes!"
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 break
continue
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)()
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"
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