当前位置:  开发笔记 > 编程语言 > 正文

在python中使用相同的运算符添加lambda函数

如何解决《在python中使用相同的运算符添加lambda函数》经验,为你挑选了3个好方法。

我有一个相当冗长的等式,我需要使用scipy.integrate.quad进行整合,并想知道是否有办法将lambda函数相互添加.我的想法是这样的

y = lambda u: u**(-2) + 8
x = lambda u: numpy.exp(-u)
f = y + x
int = scipy.integrate.quad(f, 0, numpy.inf)

我真正使用的方程远比我在这里提到的方程复杂得多,因此为了便于阅读,将方程式分解为更小,更易于管理的部分将是有用的.

有没有办法处理lambda函数?或者也许是另一种甚至不需要lambda函数但会提供相同输出的方法?



1> RJHunter..:

在Python中,通常只使用lambda作为非常简短的函数,这些函数很容易适应创建它们的行.(有些语言有其他意见.)

正如@DSM在他们的评论中暗示的那样,lambdas本质上是创建函数的捷径,因为它不值得为它们命名.

如果你正在做更复杂的事情,或者如果你需要给代码命名以供以后参考,那么lambda表达式对你来说不是一个快捷方式 - 相反,你可能也是def一个普通的旧函数.

因此,不是将lambda表达式赋给变量:

y = lambda u: u**(-2) + 8

您可以将该变量定义为函数:

def y(u):
    return u**(-2) + 8

这给了你一些解释,或者更复杂,或者你需要做什么的空间:

def y(u):
    """
    Bloopinate the input

    u should be a positive integer for fastest results.
    """
    offset = 8
    bloop = u ** (-2)
    return bloop + offset

函数和lambda都是"可调用的",这意味着它们基本上可以互换scipy.integrate.quad().

要组合callables,您可以使用几种不同的技术.

def triple(x):
   return x * 3

def square(x):
   return x * x

def triple_square(x):
   return triple(square(x))

def triple_plus_square(x):
    return triple(x) + square(x)

def triple_plus_square_with_explaining_variables(x):
    tripled = triple(x)
    squared = square(x)
    return tripled + squared

有更高级的选项,我只会考虑它,如果它使您的代码更清晰(它可能不会).例如,您可以将callable放在列表中:

 all_the_things_i_want_to_do = [triple, square]

一旦它们进入列表,您就可以使用基于列表的操作来处理它们(包括将它们依次应用到reduce列表中的单个值).

但是如果你的代码和大多数代码一样,那些只是按名称相互调用的常规函数​​将是最简单的编写和最容易阅读的函数.


这可能是OP真正问题的解决方案.

2> fjarri..:

没有内置的功能,但你可以很容易地实现它(当然有一些性能损失):

import numpy

class Lambda:

    def __init__(self, func):
        self._func = func

    def __add__(self, other):
        return Lambda(
            lambda *args, **kwds: self._func(*args, **kwds) + other._func(*args, **kwds))

    def __call__(self, *args, **kwds):
        return self._func(*args, **kwds)

y = Lambda(lambda u: u**(-2) + 8)
x = Lambda(lambda u: numpy.exp(-u))

print((x + y)(1))

可以以类似的方式添加其他运算符.



3> eph..:

有了sympy你可以做这样的功能操作:

>>> import numpy
>>> from sympy.utilities.lambdify import lambdify, implemented_function
>>> from sympy.abc import u
>>> y = implemented_function('y', lambda u: u**(-2) + 8)
>>> x = implemented_function('x', lambda u: numpy.exp(-u))
>>> f = lambdify(u, y(u) + x(u))
>>> f(numpy.array([1,2,3]))
array([ 9.36787944,  8.13533528,  8.04978707])

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有