Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

320
Vistas
Python multilínea lambda

Me pregunto si es posible encontrar algún equivalente a la función lambda multilínea de C# en Python.

Digamos que tengo un código C# como este: ingrese la descripción de la imagen aquí

Quiero escribir un código Python equivalente para este método. Pero que yo sepa, no hay posibilidad de tener funciones lambda multilínea en python. ¿Alguna idea sobre algún código equivalente de Python para esto?

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Puede definir su lambda en varias líneas si pone la expresión entre paréntesis. Esto crea una continuación de línea implícita, lo que hace que se ignoren las líneas nuevas hasta el paréntesis de cierre.

 >>> func = lambda a,b: ( ... b - a if a <= b else ... a*b ... ) >>> >>> func(23, 42) 19

También puede usar explícitamente el carácter de continuación de línea "\", pero este no es el enfoque preferido por la guía de estilo de Python . (No es que vincular lambdas a nombres sea una buena idea para empezar , para ser justos...)

 >>> func = lambda a,b: \ ... b - a if a <= b else \ ... a*b >>> >>> func(23, 42) 19

Por supuesto, solo puede tener expresiones dentro de su lambda, y no declaraciones. Tan correcto if los bloques y los return y similares siguen siendo imposibles.


Además, puede que no sea necesario usar lambdas aquí en absoluto, porque a diferencia de C# (antes de la reciente versión 7.0), Python es capaz de anidar funciones completas:

 >>> def method(x,y): ... def func(a,b): ... if a <= b: ... return b - a ... return a * b ... return func(x,y) ... >>> method(23, 42) 19
about 4 years ago · Santiago Trujillo Denunciar

0

Hay una forma complicada de crear no solo una lambda de varias líneas para formatear, sino también una que sea realmente de varias líneas lógicamente. Implica usar el comando exec para convertir una cadena en una función. No sé cuán eficiente es esto, pero funciona. Se me ocurrió esto porque a veces quiero crear una función lambda personalizada para la función ordenada y no quiero definir una función persistente. Así que echa un vistazo a lo siguiente:

 def strToFun(x): name = x[x.find(' ') + 1:x.find('(')] exec(x) ret = eval(name) return ret

Esto creará una función y devolverá un puntero a esa función. Si ejecuta la siguiente prueba, verá que hay una función llamada f1 pero no una llamada fun1. Fun1 es un marcador de posición porque tenemos que tener un nombre de función cuando usamos def. exec crea una función dentro de la función strToFun. eval devuelve un puntero a esa función sin ejecutarla. La función devuelve el puntero y la función interna llamada fun1 queda fuera del alcance.

 f1 = strToFun('def fun1(x): return x + 1') print(f1, type(f1), f1(100)) print(dir())

En lugar de almacenar la función recién creada en una variable, también podría usarla directamente como lo haría con una expresión lambda:

 print(strToFun('def fun1(x): return x + 1')(200))

Así que lo uso así para crear lambdas complejas cuando necesito:

 countries = ['Uganda', 'Canada', 'USA', 'Albania', 'USA'] print(sorted(countries , key = strToFun( '''def _fun1(x): if x == 'USA': return (0,) elif x == 'Canada': return (1,) else: return(2, x) ''')))

Estoy seguro de que recibiré muchos comentarios sobre lo poco pitónico que es esto y que si Guido quisiera que tuviéramos lambdas de varias líneas, lo habría puesto en el idioma. Sin embargo, es un truco interesante y efectivo cuando lo necesitas, entonces, ¿qué podría tener eso de malo?

about 4 years ago · Santiago Trujillo Denunciar

0

Puedes escribirlo como una función en línea:

 lambda x, y : (x<=y)*(yx) + (x>y)*x*y
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda