while sentencias numeros for else ejemplos dentro comparar python if-statement

numeros - sentencias en python



Forma más corta, más pitonica de escribir una declaración if (6)

tengo esto

bc = ''off'' if c.page == ''blog'': bc = ''on'' print bc

¿Hay alguna forma más pitonica (y / o más corta) de escribir esto en python?


Bueno, al no ser un pitón, tómenlo con un grano de sal, pero después de haber escrito (y, con más dificultad, leer ) muchos códigos inteligentes a lo largo de los años, ahora tengo una fuerte preferencia por el código legible. Tengo la esencia de lo que estaba haciendo tu código original, aunque no soy nadie como un chico de Python. Para estar seguro, podrías esconderlo y quizás impresionar a uno o dos expertos de Python, pero ¿por qué?


El más corto debería ser:

bc = ''on'' if c.page==''blog'' else ''off''

En general, esto puede parecer un poco confuso, por lo que solo debe usarlo cuando esté claro lo que significa. No lo use para grandes cláusulas booleanas, ya que comienza a verse feo rápidamente.


Esto es:

  1. definitivamente más corto
  2. posiblemente Pythonic (pre-Python 2.5, que introdujo la controvertida sintaxis X if Z else Y )
  3. cuestionablemente legible. Con esas advertencias en mente, aquí va:

    bc = ("off","on")[c.page=="blog"]

EDITAR: según solicitud, la forma generalizada es:

result = (on_false, on_true)[condition]

Explicación: la condition puede ser cualquier cosa que se evalúe como booleana. Luego se trata como un entero ya que se usa para indexar la tupla: False == 0 , True == 1 , que luego selecciona el elemento correcto de la tupla.


O puede usar una instrucción If en línea:

>>> cpage = ''blog'' >>> bc = ''on'' if cpage == ''blog'' else ''off'' >>> bc ''on'' >>> cpage = ''asdf'' >>> bc = ''on'' if cpage == ''blog'' else ''off'' >>> bc ''off''

Hay un poco de un informe sobre esa función en este blog , y el PEP relevante es PEP308 . La instrucción if en línea se introdujo en Python 2.5.

Este podría ser un poco menos pitónico, pero puede usar y / o de esta manera:

>>> cpage = ''asdf'' >>> bc = (cpage == ''blog'') and ''on'' or ''off'' >>> bc ''off'' >>> cpage = ''blog'' >>> bc = (cpage == ''blog'') and ''on'' or ''off'' >>> bc ''on''

Este se usa más a menudo en las declaraciones lambda que en una línea en sí misma, pero la forma

A and B or C

es parecido a

if A: return B else: return C

Iba a escribir una explicación un poco más larga, pero la cubrieron mejor en Dive into Python . También notaron algunas advertencias que probablemente necesites saber.


Otra posibilidad es usar un dict si puede calcular los valores fuera de la función que accede a ellos (es decir, los valores son estáticos, que también abordan el problema de evaluación en los comentarios de la respuesta de scrible).

want_bc = {True: "on", False: "off"} # ... bc = want_bc[c.page == "blog"]

Prefiero esto y / o las soluciones de indización de tuplas bajo la rúbrica general de preferir el cálculo a la prueba.


Puedes usar,

a = b if c else d

pero si está usando una versión de Python antes de la 2.5,

bc = c.page == "blog" and "on" or "off"

puede hacer el truco también