2010-10-23 12 views
9

Estaba repasando la pregunta del código de golf aquí en Desbordamiento de pila y vi muchas soluciones de línea perl.¿Es posible escribir frases sencillas en Python?

Mi pregunta es: ¿es posible algo así en Python?

+2

Sí ??? Puede ser una buena idea especificar lo que quiere hacer ... –

+2

pertenece a programmers.stackexchange.com – SilentGhost

+1

Hay muchos liners de pitón con la etiqueta de cods-golf. No tantos como perl, pero estoy sorprendido de que no haya visto a ninguno de ellos –

Respuesta

17

python -c 'print("Yes.")'

14

Es posible escribir trazadores de líneas uno en Python, pero es incómodo (Python anima código bien sangría que es algo en desacuerdo con el concepto de "una sola línea"). Es un poco más fácil en Python 3 porque print() es una función y no una declaración. Aquí hay uno:

python -c "fact = lambda x: x * fact(x-1) if x > 1 else 1; print(fact(5))" 

Así es como se podría escribir un grep como la función (en este ejemplo líneas grabados de entrada que contiene "foo"):

python -c "for s in __import__('fileinput').input(): __import__('sys').stdout.write(s) if 'foo' in s else None" 
0

aquí es mi truco para ejecutar varias instrucciones:

[stmt1, stmt2, expr1][2] if requiere la evaluación perezosa: [lambda(): stmt1; lambda(): stmt2][not not boolExpr]()

4

En Bourne Shel l se puede usar algo llamado heredoc de moverse por la dependencia de Python en guiones:

[email protected]:0:~$ python << 'EOF' 
> for i in range(3): 
> print i 
> EOF 
0 
1 
2 
[email protected]:0:~$ 
+1

no, no puedes. usted sangró 'imprima'. Pruébalo sin sangrarlo y obtienes un 'IndentationError' justo como se supone que debes hacerlo. – aaronasterling

+1

Lo expresé mal. Esto le da la capacidad de aplicar sangría al código, sin tener que crear un archivo, abrir el editor, etc. – S010

+0

No existe realmente algo así como "evitar" la dependencia de las sangrías para Python, ya que haría imposible escribir la mayoría de los programas no triviales. Lo que la mayoría de los lectores buscan es cómo indicar la sangría/dederación de una sola línea. –

7

termino querer hacer esto con bastante frecuencia al hacer las cosas de la cáscara. No termina siendo más compacto, y en muchos casos es más fácil simplemente escribir un comando de shell multilínea que escribir todo como un lambda. No se puede usar ninguna declaración de Python que termine con dos puntos. Por lo que al final tener que

  • escribir ningún código for -como como genexp o lista de comprensión. Lo hago de todos modos para la mayoría de cosas, pero es molesto tener que import sys y empujar todo para sys.stdout.writelines en los casos en que de lo contrario sólo podía

    for tree in forest: 
        print tree 
    
  • escritura lambdas en lugar de las definiciones de funciones. Esto a menudo es factible y tiene el efecto secundario útil de forzarte a escribir funciones muy dirigidas que realmente solo hacen una cosa. Sin embargo, no es particularmente conveniente, y no funciona para nada que mute un valor (por ejemplo, dict.update) y luego devuelve algún elemento.

  • se molestan hacer las cosas correctamente con gestores de contexto

  • no hace ningún control de excepciones.

  • Utilice un diccionario de lambdas en lugar de if/else secciones.

  • Usa type(name, bases, dict) para declarar cualquier clase. Esto es bastante divertido, pero solo funciona si estás declarando una clase cuyos métodos se pueden expresar como lambdas.

Así que para algunas cosas que funciona, pero en general es un gran problema, ya que acaban de tener que usar un estilo funcional que Python no apoya realmente.La mayoría de las veces me acaba de escribir comandos shell de varias líneas como

[email protected] ~ $ python -c $' 
import some_module 
for v in some_module.whatever(): 
    print "Whatever: \'{0}\'".format(v) 
' 

El $' es una sintaxis citando bash, una alternativa a sus '...' y "..." construcciones de cotización. Es útil porque funciona como '...' pero le permite escapar ' caracteres contenidos con \'. También puede incrustar líneas nuevas, por lo que el código anterior también se puede escribir como python -c $'import some_module\nfor v in some_module.whatever():\n print "Whatever: \'{0}\'".format(v)'. Sin embargo, esto es algo de un gusto adquirido.

Una cosa molesta acerca de cómo escribir comandos de varias líneas en bash es que INICIO y FIN van al principio del comando en lugar del principio de la línea. Puede haber una forma mejor de hacerlo, pero generalmente solo escaneo hacia atrás y hacia adelante manteniendo presionadas las teclas de flecha izquierda/derecha CTRL. Algunos usuarios de emacs probablemente me podrían poner directamente aquí, ya que de ahí provienen las combinaciones de teclas normales de bash.

Si desea insertar un salto de línea mientras edita un comando multilínea, puede hacerlo con^V-^J. Eso va a poner en un salto de línea en una forma tal que igualmente se pueden buscar de nuevo a las líneas anteriores, en lugar de utilizar la configuración

$ first line of the command 
> second line 
> third line 

que se obtiene de lo contrario, donde no se puede volver a las líneas anteriores .

El truco con^V-^J también funciona en ipython, por lo que es útil para editar definiciones de clases o funciones. También puede funcionar en el python REPL básico (probablemente), simplemente no lo sé porque casi siempre uso ipython.

-1

Sí, en realidad es muy común. Yo uso una línea cuando necesito escribir un código rápido. Solo depende de lo que quieras hacer. Aquí hay una pequeña línea que acabo de usar esta noche. Es la creación de un botón Tkinter en una sola línea.

a = Button(root, text="Button", command=com1).pack() 

Si necesita un código específico, hágamelo saber, estaré encantado de ayudarle.

1

Un muy buen pitón de una sola línea (como en "bastante útil"):

python -c 'import SimpleHTTPServer as foo; foo.test()' 23433 

servidor web básico instantánea en el directorio actual. (Acaba de presentar a esto hoy, muy práctico.)

0
exec("if 6 * 9 == int('42', 13):\n\tprint('Yes!')") 

Con este enfoque, todos los programas Python puede escribirse como una sola línea :)

Cuestiones relacionadas