¿Cómo poner múltiples declaraciones en una línea?

143

No estaba seguro de qué título considerar exactamente esta pregunta, codificar el golf parece apropiado si es un poco inespecífico.

Sé un poco de comprensión en Python, pero parecen muy difíciles de "leer". A mi modo de ver, una comprensión podría lograr lo mismo que el siguiente código:

for i in range(10): if i == 9: print('i equals 9')

Este código es mucho más fácil de leer que cómo funcionan actualmente las comprensiones, pero he notado que no puede tener dos ':' en una línea ... esto también me trae ...

mi pregunta:

¿Hay alguna manera de obtener el siguiente ejemplo en ONE LINE?

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

Algo como esto sería genial:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

Pero de nuevo me encuentro con el conflictivo ':' También me encantaría saber si hay una forma de ejecutar el intento (o algo así) sin excepción, parece completamente inútil que necesito poner excepto: pasar allí. Es una línea desperdiciada.

Gracias por tu aporte ... y aquí tienes una carita sonriente : D

Rhys
fuente
¿Por qué alguna vez arrojaría una excepción?
Ignacio Vázquez-Abrams
1
sam [2] puede no existir. Es un ejemplo hipotético. gracias
Rhys
44
La comprensión es algo diferente en Python. Poner todo en una línea no es comprensión.
Felix Kling
Soy consciente de esto sí. Gracias. Estaba demostrando cómo creo que la comprensión podría funcionar mejor, pero no puede debido al colon, que es la raíz de mi problema / pregunta
Rhys
Solo use \nsy use espacios para las sangrías.

Respuestas:

144

Desafortunadamente, lo que quiere no es posible con Python (lo que hace que Python sea casi inútil para los programas de una línea de comandos). Incluso el uso explícito de paréntesis no evita la excepción de sintaxis. Puede salirse con una secuencia de declaraciones simples, separadas por punto y coma:

for i in range(10): print "foo"; print "bar"

Pero tan pronto como agrega una construcción que introduce un bloque sangrado (como if), necesita el salto de línea. También,

for i in range(10): print "i equals 9" if i==9 else None

es legal y puede aproximarse a lo que quieres.

En cuanto a la try ... exceptcosa: sería totalmente inútil sin el except. trydice "Quiero ejecutar este código, pero podría arrojar una excepción". Si no te importa la excepción, deja de lado el try. Pero tan pronto como lo pones, estás diciendo "Quiero manejar una posible excepción". El passentonces dice que no desea manejar la situación específica. Pero eso significa que su código continuará ejecutándose, de lo contrario no lo haría.

ThomasH
fuente
1
interesante, creo que su último ejemplo se acerca más a la respuesta que estaba buscando. gracias
Rhys
con respecto a la pregunta 'probar' ... ¿Qué pasa si, sé que en algún momento arrojará una excepción, pero solo quiero que el código continúe ejecutándose ... por ejemplo, para verificar si una cadena puede ser un número entero? intente: int (string) ... Si no puede, simplemente continúe con la siguiente línea, sin necesidad de una excepción. Veo lo que está diciendo, pero ¿hay alguna otra manera que pueda adaptarse a este tipo de control / manejo de errores
Rhys
44
Re try:: Las reglas de sintaxis de Python simplemente no le permitirán salirse con la suya con una única cláusula de "prueba" sin acompañar la cláusula "excepto". Lo que hago es ajustar el try-except en función propia, y llamar a esto en su lugar. Me gusta if (checkint(s))...y def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH
ThomasH, desearía que tu comentario fuera una respuesta a una pregunta en algún lugar para poder votarlo. Excelente.
Ivan X
55
@ThomasH " (lo que hace que Python sea casi inútil para los programas de una línea de comandos) ": no me obstaculiza. El 95% de los casos no necesitan línea nueva. Y el resto a través de \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr
52

Puede usar la declaración de ejecución integrada, por ejemplo:

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

Donde \nes una nueva línea y \tse usa como sangría (una pestaña).
Además, debe contar los espacios que usa, para que su sangría coincida exactamente.

Sin embargo, como todas las otras respuestas ya dijeron, esto por supuesto solo se debe usar cuando realmente tiene que ponerlo en una línea.

exec es una declaración bastante peligrosa (especialmente cuando se construye una aplicación web) ya que permite la ejecución de código arbitrario de Python.

elecprog
fuente
44
¡Gracias! Esto debe marcarse como la respuesta correcta, ya que en realidad funciona, a diferencia de los demás. Pero, por supuesto, ¡ nunca hagas esto a menos que tengas que hacerlo! Sin embargo, realmente necesito esta sintaxis, ya que tengo que ingresar scripts en un cuadro de texto fijo de una línea.
Sanjay Manohar
Gracias ! Salvavidas! No uso esto en mi script, pero en el shell interactivo esto es útil para la depuración ... A menudo simplemente salgo del shell interactivo y lo reinicio para obtener un entorno limpio y luego tengo que repetir ciertos pasos, es decir, importar un módulo, ejecutando algunas funciones y luego hacer alguna prueba con una función específica. Entonces, estaba buscando una manera de poner "importar un módulo, ejecutar algunas funciones" en un oneliner, para poder recuperarlo rápidamente del historial y ejecutarlo (en lugar de tener que devolver 5 elementos diferentes del historial) +1
oneindelijk
exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") mejor :)
kxr
Gracias kxr :) (Usé tu idea para mejorar la respuesta)
elecprog
6

Recomiendo no hacer esto ...

Lo que estás describiendo no es una comprensión.

PEP 8 Guía de estilo para el código Python , que no recomiendo, tiene esto que decir sobre los estados compuestos:

  • Las declaraciones compuestas (declaraciones múltiples en la misma línea) generalmente se desaconsejan.

Si:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()

Más bien no:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

Aquí hay una muestra de comprensión para hacer la distinción:

>>> [i for i in xrange(10) if i == 9]
[9]
Johnsyweb
fuente
6

Sí, esta publicación tiene 8 años, pero en caso de que alguien venga aquí también buscando una respuesta: ahora puede usar punto y coma. Sin embargo, no puede usar las declaraciones if / elif / else, para bucles for / while, y no puede definir funciones. El uso principal de esto sería cuando se usan módulos importados en los que no tiene que definir ninguna función o usar las declaraciones / bucles if / elif / else / for / while.

Aquí hay un ejemplo que toma al artista de una canción, el nombre de la canción y busca genio la letra:

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())
symbxlz
fuente
6

No incentivo esto, pero digo que estás en la línea de comando, no tienes nada más que Python y realmente necesitas una frase, puedes hacer esto:

python -c "$(echo -e "a='True'\nif a : print 1")"

Lo que estamos haciendo aquí es el preprocesamiento \nantes de evaluar el código Python.

Eso es super hacky! No escriba código como este.

Tiago Lopo
fuente
1

tal vez con "y" o "o"

después de falsa necesidad de escribir "o"

después de la verdadera necesidad de escribir "y"

me gusta

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

resultado:

false 1
false 2
false 3
true 4
false 5

o tal vez como

(returnsfalse() or true) and (returnstrue() or true) and ...

llegué buscando en google "cómo poner múltiples declaraciones en una línea de python", no responde preguntas directamente, tal vez alguien más lo necesite.

Shimon Doodkin
fuente
1

Para una python -csolución orientada, y siempre que use Bash shell, sí, puede tener una sintaxis simple de una línea como en este ejemplo:

Supongamos que desea hacer algo como esto (muy similar a su muestra, incluidas las except: passinstrucciones):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

Esto NO funcionará y producirá este error:

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

Esto se debe a la competencia entre Bash y Python Interpretación de \nsecuencias de escape. Para resolver el problema, se puede usar la $'string'sintaxis de Bash para forzar la \ninterpretación de Bash ANTES de la de Python. Para hacer el ejemplo más desafiante, agregué una end=..\n..especificación típica de Python en la llamada impresa de Python: al final podrá obtener AMBAS \ninterpretaciones de bash y Python trabajando juntos, cada uno en su texto de interés. Para que finalmente la solución adecuada sea así:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

Eso conduce a la salida limpia adecuada sin error:

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

Nota: esto debería funcionar también con execsoluciones orientadas, porque el problema sigue siendo el mismo (competencia de intérpretes de Bash y Python).

Nota 2: se podría solucionar el problema reemplazando algunos \npor algunos, ;pero no funcionará en cualquier momento (dependiendo de las construcciones de Python), mientras que mi solución siempre permite "una línea" a cualquier pieza del programa clásico de Python de varias líneas.

Nota 3: por supuesto, cuando se trata de un solo revestimiento, uno siempre tiene que ocuparse de los espacios de Python y la sangría, porque de hecho no estamos estrictamente "alineados" aquí, PERO haciendo una gestión mixta adecuada de la \nsecuencia de escape entre bash y Python . Así es como podemos lidiar con cualquier pieza del programa clásico de Python multilínea. La muestra de la solución también ilustra esto.

Pierre13fr
fuente
0

Está mezclando muchas cosas, lo que dificulta responder su pregunta. La respuesta corta es: Hasta donde yo sé, lo que quieres hacer no es posible en Python, ¡por una buena razón!

La respuesta más larga es que debería sentirse más cómodo con Python, si desea desarrollarse en Python. Las comprensiones no son difíciles de leer. Puede que no estés acostumbrado a leerlos, pero debes acostumbrarte si quieres ser un desarrollador de Python. Si hay un idioma que se adapte mejor a sus necesidades, elija ese. Si elige Python, prepárese para resolver problemas de una manera pitónica. Por supuesto, eres libre de luchar contra Python, ¡pero no será divertido! ;-)

Y si nos cuenta cuál es su verdadero problema, incluso podría obtener una respuesta pitónica. "Obtener algo en una línea" generalmente no es un problema de programación.

Achim
fuente
¡Amo python! Estaba demostrando cómo creo que las comprensiones podrían estar mejor estructuradas, pero no pueden debido al colon, que es la raíz de mi problema / pregunta ... Veo por su respuesta que las múltiples declaraciones separadas por dos puntos, como try: if sam [ 0]! = 'Harry': print ('hellp', sam) no es posible ... ¿es correcto? gracias ... solo estoy usando esto para algunos propósitos de depuración, así que estoy buscando un código pequeño y simple que se pueda quitar fácilmente y no ocupe mucho espacio lol
Rhys
Sí, por lo que sé, no es posible. Pero como alguien ya dijo: lo que haces es algo diferente a la comprensión. Si desea poder eliminar el código fácilmente, póngalo en una función. Con respecto al problema "excepto: pasar", piense en un decorador que ignore la excepción o algo así. Nuevamente: siempre trate de describir su problema real, no el problema con la solución que ya tiene en mente. ;-)
Achim
3
¿Por qué la gente tiene que comenzar su respuesta con declaraciones provocativas inadmisibles como "estás mezclando muchas cosas"? Voto negativo si puedo.
John Jiang
"Conseguir algo en una línea de" nosotros por lo general no es un problema de programación "-.> Pero eso es a menudo un problema administrador de sistemas, así que la pregunta sigue siendo relevante en este aspecto.
Alex F
0

Es posible en realidad ;-)

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

Puedes hacer cosas muy feas en Python como:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

que es función para el cifrado rot13 / cesa en una línea con 99 caracteres.

yamm
fuente
-2

Aquí hay un ejemplo:

para i en el rango (80, 90): print (i, end = "") if (i! = 89) else print (i)

Salida: 80 81 82 83 84 85 86 87 88 89

>

JZP
fuente