2009-11-13 8 views
38

De vez en cuando veo el código de alguien y lo que parece ser una línea única, que es una afirmación de una línea que funciona de la forma estándar en que funcionan los enunciados tradicionales "si" o "para".¿Son buenas las frases 'si'/'para' en el estilo de Python?

He buscado en Google y realmente no puedo encontrar el tipo de cosas que puedes realizar? ¿Alguien puede aconsejar y preferiblemente dar algunos ejemplos?

Por ejemplo, podría hacer esto en una sola línea:

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

O:

for a in someList: 
    list.append(splitColon.split(a)) 
+1

No estoy seguro de lo que está buscando ... ¿me puede explicar un poco más? –

+0

¿No tiene Python esas extrañas cosillas lambda hoy en día que le permiten poner mucho más en una línea? No es que alguna vez los use, por supuesto. Prefiero la forma antigua de hacer las cosas :-) – paxdiablo

+1

aún no he investigado sobre lambda. cada vez que veo esa palabra en una pregunta, ¡rápidamente hago clic en un marcador! – Federer

Respuesta

50

Bueno,

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

¿Es esto una mejora? No. Incluso podría agregar más declaraciones al cuerpo de la cláusula if, separándolas con un punto y coma. Recomiendo contra que sin embargo.

+5

Excepto codegolf, por supuesto, entonces el punto y coma son vitales :-) – paxdiablo

+0

no solo 'imprimiría' sí '' sería mejor como lo conocemos '"examen" en "ejemplo"' es verdadero –

+8

Anurag: Quizás hay una razón por la cual Stephan usó la palabra "ejemplo" en este segmento de código. – jmucchiello

18

De manera más general, todos los siguientes son sintácticamente válida:

if condition: 
    do_something() 


if condition: do_something() 

if condition: 
    do_something() 
    do_something_else() 

if condition: do_something(); do_something_else() 

... etc.

+2

finalmente punto y coma ... ¡que he estado buscando! – holms

+0

Para ser claros, ¡no use puntos y comas como este! Solo estaba tratando de responder la pregunta por completo. –

+0

alguna razón para eso? eso simplifica mi vida en algunas sentencias if, seguidas de las declaraciones de impresión, seguidas de sys.exit() – holms

3

Se podría hacer todo eso en una sola línea omitiendo la variable example:

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

Python le permite poner la cláusula de sangría en la misma línea si es sólo una línea:

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

def squared(x): return x * x 

class MyException(Exception): pass 
+1

ejemplo no está definido. Necesita citas. –

+2

¿Qué parte del ejemplo no entendiste? Cada fragmento de código no necesita declarar todas sus variables. – jmucchiello

11

un ejemplo de una función de idioma que no solo elimina los saltos de línea, aunque todavía no está convencido de que esto sea más claro que la versión más detallada

a = 1 si x> 15 persona 2

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

puede volver a escribir lo anterior como:

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

+1 para Comprensión de lista – cschol

+0

En la primera instancia usa 'list' y en el segundo usa' newlist'. ¿Hay alguna razón para el cambio? – cregox

+1

@Cawas, oh, de hecho. El OP usó "lista" en su código. No es una buena práctica * sombrear * función incorporada o escribir nombres, es decir, la "lista". Es por eso que utilicé "nueva lista" en mi respuesta. –

38

he encontrado que en la mayoría de los casos hacen cláusulas de bloque en una línea es una mala idea

Esto, de nuevo como una generalidad, reducirá la calidad de la forma del código. La forma de código de alta calidad es una característica clave del lenguaje para python.

En algunos casos, python ofrecerá maneras de hacer cosas todo en una línea que son definitivamente más pitónicas. Las cosas tales como lo que Nick D menciona la lista por comprensión:

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

aunque menos que necesite una lista reutilizable específicamente es posible que desee considerar el uso de un generador en lugar

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

nota la mayor diferencia entre los dos es que no se puede reiterar sobre un generador, pero es más eficiente de usar.

También hay una construida en el operador ternario en las versiones modernas de pitón que le permiten hacer cosas como

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

o

iterator = max_value if iterator > max_value else iterator 

algunas personas pueden encontrar estos más legible y utilizable que el bloque similar if (condition):.

Cuando se trata de eso, se trata de estilo de código y cuál es el estándar del equipo en el que está trabajando. Eso es lo más importante, pero en general, desaconsejaría un bloque de líneas ya que la forma del código en python es muy importante.

+0

He encontrado que el operador ternario es útil para casos como 'logging.info ("% encontrado% d% s ", num_resultados," resultado "si num_results == 1 else" resultados ")'. – Dennis

+2

Realmente me gusta el ternario de Python. Una vez que esté acostumbrado, es mucho más legible que la mayoría de los idiomas. Hace el histórico '? : 'parece bastante arcaico. –

+0

¡Gracias, esto realmente ayudó! –

0

Inmersión en Python tiene un poco donde habla de lo que él llama la and-or trick, que parece como una forma efectiva de meter lógica compleja en una sola línea.

Básicamente, simula el operador ternario en c, al brindarle una forma de probar la verdad y devolver un valor basado en eso. Por ejemplo:

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

Tenga cuidado: esto no * simula el operador ternario de C. '1? 0: 2' es igual a '0', pero' 1 y 0 o 2' es igual a '2'. Es mucho más seguro usar otra construcción que se hace precisamente para este propósito: '0 if 1 else 2' (que * dará * rendimiento' 0'). – Stephan202

+0

(El problema aquí es que '0' se evalúa como' False'. La razón por la que su código * does * work es porque '" firstvalue "' evalúa como 'True'.) – Stephan202

+0

Este truco es anterior al operador ternario, y es una aproximación en el mejor de los casos, dados sus problemas con valores cuyo valor booleano es False. – PaulMcG

3

Las versiones anteriores de Python sólo permitiría una sola declaración simple después de for ...: declaraciones introductorias if ...: o similares en bloque.

Veo que uno puede tener múltiples declaraciones simples en la misma línea que cualquiera de estos. Sin embargo, hay varias combinaciones que no funcionan. Por ejemplo podemos:

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

... pero, por otro lado, no podemos:

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

Podemos:

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

... pero podemos 't:

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

... y así sucesivamente.

En cualquier caso, todos estos se consideran extremadamente NO-pitónicos. Si escribes código como este, la experiencia de Pythonistas probablemente tomará una visión débil de tus habilidades.

En algunos casos, es marginalmente aceptable combinar declaraciones múltiples en una línea. Por ejemplo:

x=0; y=1 

... o incluso:

if some_condition(): break 

... por simples breakcontinue e incluso return declaraciones o Traspaso.

En particular, si es necesario utilizar una serie de elif uno podría usar algo como:

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

... entonces puede que no irritar a sus colegas demasiado. (Sin embargo, las cadenas de elif como ese grito para ser refactorizado en una mesa de despacho ...un diccionario que podría parecerse más a:

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


# ... 
while True: 
    key = SomeGetKey() 
    dispatch.get(key, foo.try_again)() 
0

Este es un ejemplo de "si no" con acciones.

>>> 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 
Cuestiones relacionadas